릿코드(LEETCODE)

231. Power of Two

cepiloth 2020. 2. 8. 20:18
반응형

https://leetcode.com/problems/power-of-two

불러오는 중입니다...

 

와 이거 정말 환장하겠네 엄청 쉽다고 생각한 문제였는데 8번 연속 틀려서 막일로 접근해서 풀었음.

일단 2의 제곱인지 확인하는 문제임.

 

 

완전 노가다 접근

0 이면 제곱 아니면

1, 2 는 제곱수

그 외에의 2의 제곱인지 판단하기 위해서 테이블을 만듦 INT 자료 범위 맥스까지 2 곱해서 TABLE을 만든다.

모든 2의 제곱을 TABLE에 계산해서 기록한다.

이후 기록한 테이블과 입력으로 들어오는 N의 값이 같으면 TRUE 

N의 값이 TABLE에 값 보다 크다면 FALSE로 막일로 풀었다. 으아아 아..

 

class Solution {
public:
    bool isPowerOfTwo(int n) {
        
        if(n == 0)
            return false;
        
        if(n == 1)
            return true;
        
        if(n == 2)
            return true;
        
        long long cand = 2;
        int int_max = 2147483647;
        vector<int> arr;
        int table_max = sqrt(int_max);
        
        for(int i=0; i<table_max; i++) {
            cand *= 2;
            if(cand > int_max) {
                break;
            }
            arr.push_back(cand);
        }
        
        for(int i=0; i<arr.size(); i++) {
            int cand = arr[i];
            if(cand > n) {
                return false;
            }
            
            if(arr[i] == n) {
                return true;
            }
        }
        
        return false;
    }
};

 

아무리 생각해도 멍청한 짓 같아 2의 거듭제곱인지 판단하는 글을 보고 적용했는데.. 안된다.

https://sgc109.tistory.com/130

 

2의 거듭제곱인지 O(1)에 판별하는 방법

1 2 if(n == (n&-n)) printf("2의 거듭제곱!"); else printf("2의 거듭제곱 아님!"); cs 이유를 설명하자면 2의 거듭제곱은 어떤 한 비트만 켜져있을 것이다. n & -n 은 n에서 켜져있는 가장 아래의 비트만 켜진..

sgc109.tistory.com

저 필자의 블로그 내용이 틀린 건 아닐 것이다. 해당 문제에서 자료 범위가 무엇인가 다른 게 있어서 그런 거 같다. 

 

문제의 원인을 찾았다. 입력으로 들어오는 N의 값이 음수도 들어올 수 있었다. 음수인 경우는 2의 배수가 아님으로 아래와 같이 에러 처리를 추가한다.

class Solution {
public:
    bool isPowerOfTwo(int n) {
        if(n <= 0)
            return false;
        return (n & (n - 1)) == 0;
    }
};

비트 연산을 이용하여 마지막 비트가 없으면 2의 배수이다.

 

반응형