[LeetCode] Power Of Two JavaScript

IT공부중·2020년 6월 25일
0

알고리즘

목록 보기
31/49

문제

문제 LeetCode - Power Of Two

주어지는 숫자 n이 2의 제곱으로 나타낼 수 있는지를 확인하는 것이다. 나타낼 수 있다면 true 없다면 false를 return 해주면 된다.

나의 코드

나의 코드는 n이 1일 때는 2의 0승 이므로 그냥 true를 반환하게 했다.
그 이후로는 result를 2씩 곱해서 n과 같아지면 true를 리턴 하고 더 커질 경우에 false를 출력하게 했다.

const isPowerOfTwo = function (n) {
  if (n === 1) return true;
  let result = 1;
  while (true) {
    result *= 2;
    if (result === n) return true;
    else if (result > n) return false;
  }
};

하지만 이 코드는 단순 노가다일 뿐이라는 것을 다른 사람의 코드를 보고 알았다.

더 나은 코드

n이 1보다 작으면 바로 false를 리턴하게 했다.

그리고 n과 n -1 을 비트연산 &을 써서 0 이면 true 아니면 false를 return 하게 한다.

그 이유는 n 이 2의 배수라면 1, 10, 100, 1000 과 같이 맨 앞자리 빼고 0을 가지게 된다. 그것의 -1 한 값은 0, 01, 011, 0111 과 같이 맨 앞자리 빼고 다 1이 된다. 어느 것도 1, 1 이 없기 때문에 0이 된다. 그래서 n 과 n - 1을 & 비트연산 했을 때 0이 나오면 n은 2의 제곱 수라고 할 수 있다.

const isPowerOfTwo1 = function (n) {
  if (n < 1) {
    return false;
  }
  return (n & (n - 1)) === 0;
};
profile
3년차 프론트엔드 개발자 문건우입니다.

0개의 댓글