[Javascript] 2의 거듭제곱인지 확인하는 방법

아데스티·2023년 1월 16일
0

알고리즘 테스트

목록 보기
1/10

문제

수를 입력받아 2의 거듭제곱인지 여부를 리턴해야 합니다.

입력

인자 1 : num
number 타입의 정수 (num >= 1)

출력
boolean 타입을 리턴해야 합니다.

주의 사항
반복문(while)문을 사용해야 합니다.
2의 0승은 1입니다.
Number.isInteger, Math.log2, Math.log 사용은 금지됩니다.

입출력 예시

let output1 = powerOfTwo(16);
console.log(output1); // true

let output2 = powerOfTwo(22);
console.log(output2); // false

내가 생각한 풀이

  • 입력받은 num이 1이 아닌 경우
  • while으로 제곱근을 계속해서 만든다.
  • 2가 아닌 경우 결국 실수가 나온다.

내가 작성한 코드

function powerOfTwo(num) {
    if(num === 1) return true;


    while ((num % 1) === 0 && num > 0) {
        if(num === 2) return true;
        num = Math.sqrt(num);
    }

    return false;
}
  • 이 경우 발생하는 예외사항
  • 2의 5제곱인 32의 제곱근은 5.65685424...
    • 2 x 2 = 4 x 2 = 8 x 2 = 16 x 2 = 32
    • true값이 반환되어야 하는 데 false를 return

문제를 해결한 부분

  • num으로부터 내림차순으로 확인하고자 하는 방법에 어려움을 발견
  • 2의 거듭제곱을 만드는 while문에 num을 넣어서 거듭제곱이 맞는지 확인하는 방법이 필요
function powerOfTwo(num) {
  
  // 예외처리
  // num이 1이거나 2의 배수가 아닌 경우
  if (num === 1) return true;
  if (num % 2) return false;

  // 거듭제곱을 만드는 while문
  // 확인하기 위한 범위 ( < num )
  let powered = 2;
  while (powered < num) {
    powered = powered * 2;
  }

  return powered === num;
}

요약

  • 예외처리를 먼저 진행
    • 1이면 true 홀수면 false
  • num을 확인하기 위해
    num에 직접 연산을 가할 필요 ❌
    • num을 그대로 두고 비교식과 범위를 작성

깨달은 점

  • 고민도 이론만이 아닌 풀이이 대한 데이터베이스가 있어야 할 수 있고 가치가 있다.
  • 일단은 문제와 답에 대한 패턴을 먼저 익히기 위해 정답을 확인할 수 있다면 적극적으로 확인하고 비교하자
  • 고민은 같은 문제를 다시 풀 때나, 내가 이해할 수 있는 범위 안에서의 변형문제에서나 의미가 있다.

참고 링크

[Javascript] 숫자가 정수인지, 실수인지 체크하는 2가지 방법

profile
종착지이자 거점 A Destination

0개의 댓글