[js] 팩토리얼 (lv.0, 정답률 85%)

sookyoung.k·2024년 5월 8일
0
post-thumbnail

i팩토리얼 (i!)은 1부터 i까지 정수의 곱을 의미합니다. 예를들어 5! = 5 4 3 2 1 = 120 입니다. 정수 n이 주어질 때 다음 조건을 만족하는 가장 큰 정수 i를 return 하도록 solution 함수를 완성해주세요.

  • i! ≤ n

제한사항

  • 0 < n ≤ 3,628,800

나의 풀이

const calcFac = (n) => {
    let result = 1;
    for (let i = 1; i <= n; i++) {
        result *= i;
    }
    return result;
};

function solution(n) {
    let answer = [];
    for (let i = 1; calcFac(i) <= n; i++) {
        answer.push(i);
    }
    return answer[answer.length - 1];
}

사실 다른 접근법이 생각이 나질 않았다...

그냥 팩토리얼을 구하는 함수를 만들고, for문에 조건을 문제 그대로 줬다. 그래서 answer 배열에 조건을 충족하는 숫자를 전부 담고, 리턴할 때는 배열의 가장 마지막 값을 반환한다. 이렇게 해도 풀리긴 합니다!

다른 풀이 1

function solution(n) {
    for(let i = 1, v = 1; true; v *= ++i) if(v > n) return --i;
}
  • for를 사용하여 i와 v를 각각 1로 초기화한다. i는 팩토리얼을 계산할 때 곱해지는 숫자고 v는 팩토리얼 계산 결과이다.
  • for문 조건부에 true가 있어 무한 루프를 생성한다. 루프 내에서 조건이 만족할 때까지 계속 실행한다.
  • 루프 내에서 i를 1 우선 증가시키고 v에 i를 곱하여 팩토리얼을 계산한다.
  • v가 n보다 커지면 if의 조건을 만족하며 이 경우에는 --i를 통해 마지막으로 증가된 i값을 감소시키고 그 값을 반환한다. v가 n을 초과하기 직전의 i값을 구하기 위함이다. (n보다 작거나 같은 가장 큰 팩토리얼 값)

다른 풀이 2

function solution(n) {
    var answer = 0, count = 1, i = 1;
    while(count <= n){
        i++, answer++;
        count = count * i;
    }

    return answer;
}

구현 방식에서 차이가 있을 뿐 비슷하다.

  • answer와 count 변수를 0과 1로 초기화한다. answer는 최종적으로 반환될 값이고 count는 팩토리얼을 계산하기 위한 변수다.
  • i 변수도 1로 초기화한다. 이는 팩토리얼을 계산할 때 곱해지는 수다.
  • while문 내에서 count가 n보다 작거나 같은 동안 루프를 계속해서 실행한다. count가 n보다 커질 경우 종료된다.
  • 루프 내에서 i를 1씩 증가시키고 answer도 1씩 증가시킨다. 이는 팩토리얼을 계산할 다음 숫자로 넘어가고 그 숫자가 n을 넘지 않는 최대값을 찾기 위함이다.
  • count에 i를 곱해서 팩토리얼 값을 업데이트 한다. count가 n보다 커질 경우 종료된다.
  • 최종적으로 answer을 반환한다. n을 넘지 않는 최대 팩토리얼의 기초가 되는 정수이다.
profile
영차영차 😎

0개의 댓글