๊ด€๋ฆฌ ๋ฉ”๋‰ด

Unfazedโ—๏ธ๐ŸŽฏ

2์˜ ์ œ๊ณฑ์ˆ˜ ํŒ๋ณ„, ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ˆ˜๋“ค ์ค‘ ๊ฐ€์žฅ ํฐ 2์˜ ์ œ๊ณฑ์ˆ˜ ๊ตฌํ•˜๊ธฐ ๋ณธ๋ฌธ

๋ฌธ์ œ ํ•ด๊ฒฐ (PS)/๊ธฐ์–ตํ•ด๋‘˜ ๊ฒƒ

2์˜ ์ œ๊ณฑ์ˆ˜ ํŒ๋ณ„, ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ˆ˜๋“ค ์ค‘ ๊ฐ€์žฅ ํฐ 2์˜ ์ œ๊ณฑ์ˆ˜ ๊ตฌํ•˜๊ธฐ

9taetae9 2024. 1. 17. 15:09
728x90

2์˜ ์ œ๊ณฑ์ˆ˜์ธ์ง€ ํŒ๋ณ„ํ•˜๊ธฐ

public class PowerOfTwoChecker {

    public static boolean isPowerOfTwo(int n) {
        return n > 0 && (n & (n - 1)) == 0;
    }

    public static void main(String[] args) {
        System.out.println(isPowerOfTwo(1)); // true
        System.out.println(isPowerOfTwo(2)); // true
        System.out.println(isPowerOfTwo(16)); // true
        System.out.println(isPowerOfTwo(18)); // false
    }
}

 

 

2์˜ ์ œ๊ณฑ์ˆ˜๋Š” ์ด์ง„์ˆ˜๋กœ ํ‘œํ˜„ํ–ˆ์„ ๋•Œ, 1 ๋’ค์— 0๋งŒ ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ๋Š” ํ˜•ํƒœ๋ฅผ ๊ฐ€์ง„๋‹ค. (์˜ˆ: 1, 10, 100, 1000, ...). ์ด๋Ÿฌํ•œ ํŠน์„ฑ์„ ํ™œ์šฉํ•˜์—ฌ ์•„๋ž˜์™€ ๊ฐ™์€ ๋กœ์ง์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

(n & (n-1)) == 0;

 

์ด์ง„์ˆ˜ 1000์—์„œ 1์„ ๋นผ๋ฉด ์ด์ง„์ˆ˜ 0111์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— 1000 & 0111 == 0 ์ฆ‰, ๊ฐ์ž๋ฆฌ์˜ ์ˆซ์ž๊ฐ€ ๋ฌด์กฐ๊ฑด ๋‹ฌ๋ผ์ง„๋‹ค๋Š” ํŠน์„ฑ์ด ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋น„ํŠธ and ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ–ˆ์„ ๋•Œ 0์ด ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค.

 

 

์ฃผ์–ด์ง„ ์ˆซ์ž๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ๊ฐ€์žฅ ํฐ 2์˜ ์ œ๊ณฑ์ˆ˜ ์ฐพ๊ธฐ (right shift ์—ฐ์‚ฐ ํ™œ์šฉ)

public static long findLargestPowerOfTwoLessThanOrEqual(long n) {
        n |= n >> 1;
        n |= n >> 2;
        n |= n >> 4;
        n |= n >> 8;
        n |= n >> 16;
        n |= n >> 32;
        return (n + 1) >> 1;
    }

 

์ฃผ์–ด์ง„ ์ˆ˜ ๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ˆ˜๋“ค ์ค‘ ๊ฐ€์žฅ ํฐ 2์˜ ์ œ๊ณฑ์ˆ˜๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด์„  ์šฐ์„  2์˜ ์ œ๊ณฑ์˜ ํŠน์ง•์„ ์•Œ์•„์•ผํ•œ๋‹ค. ์•ž์—์„œ๋„ ๋งํ–ˆ๋“ฏ์ด 2์˜ ์ œ๊ณฑ์ˆ˜๋Š” ์ด์ง„์ˆ˜๋กœ ํ‘œํ˜„ํ–ˆ์„ ๋•Œ, 1 ๋’ค์— 0๋งŒ ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ๋Š” ํ˜•ํƒœ๋ฅผ ๊ฐ€์ง„๋‹ค. (์˜ˆ: 1, 10, 100, 1000, ...). 

 

๊ทธ๋ž˜์„œ ํ•ด๋‹น ์ˆ˜ ๋ณด๋‹ค ๊ฐ™๊ฑฐ๋‚˜ ์ž‘์€ ์ˆ˜๋“ค ์ค‘ ๊ฐ€์žฅ ํฐ 2์˜ ์ œ๊ณฑ์ˆ˜๋ฅผ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด์„  ํ•ด๋‹น ์ˆ˜ ์ด์ง„ ํ‘œํ˜„์˜ ์ตœ์ƒ์œ„ ๋น„ํŠธ 1์„ ์ œ์™ธํ•œ ํ•˜์œ„ ๋น„ํŠธ๋“ค์ด 0์ด๋ฉด ๋œ๋‹ค.  

ex) 101101 ๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ˆ˜ ์ค‘ ๊ฐ€์žฅ ํฐ 2์˜ ์ œ๊ณฑ์ˆ˜๋Š” 100000์ด ๋œ๋‹ค.

111111 => 100000

10101 => 1000

1010 => 1000

1011 => 1000

 

์ฆ‰ ์šฐ๋ฆฌ์˜ ๋ชฉํ‘œ๋Š” ์ตœ์ƒ์œ„ ๋น„ํŠธ 1์„ ์ œ์™ธํ•œ ํ•˜์œ„๋น„ํŠธ๋“ค์ด 0์ธ ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์ด๋ฅผ ์œ„ํ•ด ์šฐ์„  ์ฃผ์–ด์ง„ ์ˆ˜ n์˜ ์ตœ์ƒ์œ„ ๋น„ํŠธ 1๋ถ€ํ„ฐ ์ตœํ•˜์œ„ ๋น„ํŠธ๊นŒ์ง€ ๋ชจ๋‘ 1๋กœ ๋งŒ๋“ ๋‹ค.   ex) 1001010 => 1111111

 

์ด์ œ ์ตœ์ƒ์œ„ ๋น„ํŠธ 1์„ ์ œ์™ธํ•œ ํ•˜์œ„ ๋น„ํŠธ ๋ชจ๋“  1๋“ค์„ 0์œผ๋กœ ๋งŒ๋“ค์–ด ์ฃผ๋ฉด ๋˜๋Š”๋ฐ ์ด๋Š” ๋‹จ์ˆœํžˆ 1์„ ๋”ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

1111111 + 1 => 10000000

์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ์€ 0์ด ํ•˜๋‚˜ ์ ์€ ์ด์ง„์ˆ˜(1000000)์ด๋ฏ€๋กœ right shift 1 (>>1 ์—ฐ์‚ฐ)์„ ํ†ตํ•ด ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

10000000 >> 1 => 1000000

 

 

์ฃผ์–ด์ง„ ์ˆ˜ n์˜ ์ตœ์ƒ์œ„ ๋น„ํŠธ 1๋ถ€ํ„ฐ ์ตœํ•˜์œ„ ๋น„ํŠธ๊นŒ์ง€ ๋ชจ๋‘ 1๋กœ ๋งŒ๋“œ๋Š” ๊ณผ์ •์„ ์กฐ๊ธˆ ๋” ์ž์„ธํžˆ ์„ค๋ช…ํ•ด๋ณด๋ฉด 

n |= n >> 1;   // ์ฒซ ๋‹จ๊ณ„์—์„œ ์ƒ์œ„ 2๋น„ํŠธ๊ฐ€ 1์ด ๋œ๋‹ค
n |= n >> 2;  // ์ƒ์œ„ 2๋น„ํŠธ๊ฐ€ 1์ด๋ฏ€๋กœ 2๋ฒˆ ์‰ฌํ”„ํŠธ ์—ฐ์‚ฐ์„ ํ•œ๋’ค bitwise or ์—ฐ์‚ฐ์„ ํ•ด์ฃผ๋ฉด ์ƒ์œ„ 4๋น„ํŠธ๊ฐ€ 1์ด๋œ๋‹ค.
n |= n >> 4;  // ์ƒ์œ„ 4๋น„ํŠธ๊ฐ€ 1์ด๋ฏ€๋กœ 4๋ฒˆ ์‰ฌํ”„ํŠธ ์—ฐ์‚ฐ์„ ํ•ด์ค€๋’ค bitwise or ์—ฐ์‚ฐ์„ ํ•ด์ฃผ๋ฉด ์ƒ์œ„ 8๋น„ํŠธ๊ฐ€ 1์ด๋œ๋‹ค.
n |= n >> 8; // ์ƒ์œ„ 8๋น„ํŠธ๊ฐ€ 1์ด๋ฏ€๋กœ 8๋ฒˆ ์‰ฌํ”„ํŠธ ์—ฐ์‚ฐ์„ ํ•ด์ค€๋’ค bitwise or ์—ฐ์‚ฐ์„ ํ•ด์ฃผ๋ฉด ์ƒ์œ„ 16๋น„ํŠธ๊ฐ€ 1์ด๋œ๋‹ค.
n |= n >> 16; // ์ƒ์œ„ 16๋น„ํŠธ๊ฐ€ 1์ด๋ฏ€๋กœ 16๋ฒˆ ์‰ฌํ”„ํŠธ ์—ฐ์‚ฐ์„ ํ•ด์ค€๋’ค bitwise or ์—ฐ์‚ฐ์„ ํ•ด์ฃผ๋ฉด ์ƒ์œ„ 32๋น„ํŠธ๊ฐ€ 1์ด๋œ๋‹ค.
n |= n >> 32;  // ์ƒ์œ„ 32๋น„ํŠธ๊ฐ€ 1์ด๋ฏ€๋กœ 32๋ฒˆ ์‰ฌํ”„ํŠธ ์—ฐ์‚ฐ์„ ํ•ด์ค€๋’ค bitwise or ์—ฐ์‚ฐ์„ ํ•ด์ฃผ๋ฉด ์ƒ์œ„ 64๋น„ํŠธ๊ฐ€ 1์ด๋œ๋‹ค.

 

์ด๋ฅผ ํ†ตํ•ด ์–‘์ˆ˜ long ๋ฒ”์œ„(2^63-1 ๊นŒ์ง€)์˜ ๋ชจ๋“  ์ˆ˜๋ฅผ ์ปค๋ฒ„ํ•˜๋ฉฐ ์ตœ์ƒ์œ„ ๋น„ํŠธ 1๋ถ€ํ„ฐ ํ•˜์œ„ ๋น„ํŠธ๋“ค์„ ๋ชจ๋‘ 1๋กœ ๋งŒ๋“ค์ˆ˜ ์žˆ๋‹ค.

 

 

 

 

์‘์šฉ๋ฌธ์ œ

 

https://www.hackerrank.com/challenges/counter-game/problem

 

Counter game | HackerRank

Louise and Richard play a game, find the winner of the game.

www.hackerrank.com

 

728x90