이번 글에서는 숫자 하나를 유일한 인수로 받아, 해당 숫자가 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);
};단, 부동소수점 연산 특성상 오차가 발생할 수 있어 위 코드처럼 반올림 처리가 필요합니다. 따라서 정확성과 단순함 면에서는 반복문 기반 구현이 실무에서 더 안전한 선택입니다.