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

JavaScript로 특정 숫자가 다른 숫자의 거듭제곱인지 확인하는 방법

문제 이해하기

두 개의 숫자 m과 n을 입력받아, m이 n의 거듭제곱인지 판별하는 JavaScript 함수를 작성해야 합니다. m이 n의 거듭제곱이라면 true를, 그렇지 않다면 false를 반환하면 됩니다.

예시는 다음과 같습니다.

m = 8, n = 2 → true (2³ = 8)
m = 100, n = 10 → true (10² = 100)
m = 0.01, n = 10 → true (10⁻² = 0.01)
m = 21, n = 3 → false

해결 접근 방식

가장 직관적인 방법은 m을 n으로 계속 나누거나 곱하면서 정확히 1에 도달하는지 확인하는 것입니다.

  • m이 1보다 크다면 n으로 계속 나눕니다.
  • m이 1보다 작다면(음의 지수 거듭제곱, 즉 소수인 경우) n을 계속 곱합니다.
  • 반복 과정에서 값이 1을 지나쳐 버리면 false를 반환합니다.
  • 정확히 1에 도달하면 true를 반환합니다.

구현 예제

const isPower = (m, n) => {
   let sign = m < 1;
   if (!m) {
      return false;
   };
   while (m !== 1) {
      if (sign) {
         m *= n;
      }
      else {
         m /= n;
      }
      if (sign ? m > 1 : m < 1) {
         return false;
      }
   };
   return true;
}
console.log(isPower(0.01, 10));
console.log(isPower(1000, 10));
console.log(isPower(1001, 10));
console.log(isPower(8, 2));
console.log(isPower(0.125, 2));

실행 결과

위 코드를 실행하면 다음과 같은 출력이 나옵니다.

true
true
false
true
true

코드 동작 원리

  • sign 변수: m이 1보다 작은지 여부를 저장합니다. 0.01처럼 1보다 작은 수도 10⁻²와 같은 음의 지수 거듭제곱일 수 있기 때문에, 이 경우에는 나누는 대신 곱셈으로 1에 다가갑니다.
  • 0 처리: m이 0이면 어떤 수의 거듭제곱도 될 수 없으므로 즉시 false를 반환합니다.
  • while 루프: m이 1이 될 때까지 반복하며, 한 번이라도 1을 벗어나면(크면 또는 작아지면) 더 이상 거듭제곱이 아니므로 false를 반환합니다.

대안: 로그 활용하기

수학적 성질을 이용하면 log(m) / log(n)이 정수인지 검사하는 방법도 있습니다.

const isPower = (m, n) => Math.log(m) / Math.log(n) % 1 === 0;

다만 부동소수점 연산 특성상 미세한 오차로 인해 잘못된 결과가 나올 수 있으므로, 실무에서는 위와 같은 반복 방식이나 오차 허용 범위(epsilon)를 두는 방식이 더 안전합니다.