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

JavaScript로 팩토리얼 역계산하기 – 입력값이 되는 수 찾기

문제 이해하기

숫자 하나를 인수로 받아, 그 숫자가 어떤 자연수의 팩토리얼(계승)과 정확히 일치하는지 확인하는 JavaScript 함수를 작성해 보겠습니다.

즉, n! = 입력값을 만족하는 자연수 n이 존재한다면 그 숫자를 반환하고, 만족하는 수가 없다면 -1을 반환하면 됩니다.

예시

입력값이 다음과 같다면,

const num = 720;

출력은 아래와 같아야 합니다.

const output = 6;

그 이유는 6! = 6 × 5 × 4 × 3 × 2 × 1 = 720이기 때문입니다. 반면 6565처럼 어떤 수의 팩토리얼로도 표현될 수 없는 값이 들어오면 함수는 -1을 반환합니다.

구현 코드

다음은 위 문제를 해결하는 전체 코드입니다.

const num = 720;
const checkForFactorial = num => {
    let prod = 1, count = 1;
    while(prod <= num){
       if(prod === num){
           return count;
       };
       count++;
       prod *= count;
   };
    return -1;
};
console.log(checkForFactorial(num));
console.log(checkForFactorial(6565));

코드 동작 원리

이 코드의 핵심 로직은 다음과 같습니다.

  • prod: 팩토리얼 값을 누적으로 곱해 나가는 변수입니다. 초기값은 1입니다.
  • count: 현재까지 곱한 횟수, 즉 후보 숫자를 의미합니다.
  • while 루프는 prod가 입력값 num보다 작거나 같은 동안 반복되며, 매번 count를 1씩 증가시키고 prod에 곱해 나갑니다.
  • 반복 도중 prod가 num과 정확히 일치하면 그 시점의 count, 즉 팩토리얼의 밑이 되는 숫자를 즉시 반환합니다.
  • 루프가 끝날 때까지 일치하는 값이 없다면 해당 숫자는 어떤 수의 팩토리얼도 아니므로 -1을 반환합니다.

이 방식은 1부터 차례대로 곱해 가면서 목표값을 넘지 않는 선에서만 진행하므로, 불필요한 연산 없이 효율적으로 답을 찾을 수 있습니다.

실행 결과

위 코드를 실행하면 콘솔에 다음과 같이 출력됩니다.

6
-1

첫 번째 호출에서는 720이 6의 팩토리얼이므로 6이 출력되고, 두 번째 호출에서는 6565가 어떤 수의 팩토리얼도 아니므로 -1이 출력되는 것을 확인할 수 있습니다.