2μ μ κ³±μ νλ³, μκ±°λ κ°μ μλ€ μ€ κ°μ₯ ν° 2μ μ κ³±μ ꡬνκΈ°
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