Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

자바스크립트로 숫자가 3의 거듭제곱인지 검증하는 방법

이번 글에서는 숫자 하나를 유일한 인수로 받아, 해당 숫자가 3의 거듭제곱인지 판별하는 자바스크립트 함수를 작성해 보겠습니다.

입력값이 3의 거듭제곱이면 true를, 그렇지 않으면 false를 반환하면 됩니다.

동작 예시

isPowerOf3(243) = true
isPowerOf3(343) = false
isPowerOf3(81) = true

구현 코드

가장 직관적인 접근 방식은 1 또는 3부터 시작해 3을 계속 곱해 가면서 입력값에 정확히 도달하는지 확인하는 것입니다. 도달했다면 그 수는 3의 거듭제곱입니다.

const num = 243;

var isPowerOf3 = (num = 3) => {
    // 1은 3^0이므로 바로 처리, 이외에는 3부터 시작
    let divisor = num === 1 ? 1 : 3;

    // 3을 계속 곱해 입력값을 넘어설 때까지 반복
    while (divisor < num) {
        divisor *= 3;
    }

    // 정확히 일치하면 3의 거듭제곱
    return divisor === num;
};

console.log(isPowerOf3(num));   // 243
console.log(isPowerOf3(343));
console.log(isPowerOf3(81));

실행 결과

콘솔에는 다음과 같이 출력됩니다.

true
false
true

코드 설명

  • 초기값 설정: 1은 3⁰이므로 거듭제곱에 해당하므로, 입력값이 1이면 곱셈 없이 바로 true가 되도록 초기값을 1로 설정합니다. 그 외의 경우에는 3부터 시작합니다.
  • 반복 처리: 현재 값이 입력값보다 작은 동안 3을 계속 곱합니다. 이 과정에서 값은 3, 9, 27, 81, 243처럼 3의 거듭제곱 순서대로 증가합니다.
  • 최종 비교: 반복이 끝난 뒤 값이 입력값과 정확히 일치하면 3의 거듭제곱이고, 중간에 입력값을 건너뛰었다면 일치하지 않으므로 false를 반환합니다.

다른 접근 방식: 로그 활용

반복문 대신 로그를 사용하면 더 간결하게 표현할 수도 있습니다. 어떤 수 n이 3의 거듭제곱이라면 log₃(n)은 항상 정수여야 한다는 성질을 이용한 방법입니다.

const isPowerOf3Log = (num) => {
    if (num <= 0) return false;
    const exp = Math.log10(num) / Math.log10(3);
    return Number.isInteger(Math.round(exp * 1e10) / 1e10);
};

단, 부동소수점 연산 특성상 오차가 발생할 수 있어 위 코드처럼 반올림 처리가 필요합니다. 따라서 정확성과 단순함 면에서는 반복문 기반 구현이 실무에서 더 안전한 선택입니다.