🗃️javascript/프로그래머스

팩토리얼(Lv.0)[반복을 너무 많이 돌리면 시간초과로 오류가 뜬다.]

하얀성 2023. 1. 10. 18:46
<문제 설명>

 

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

  • i! ≤ n

제한사항
  • 0 < n ≤ 3,628,800

입출력 예nresult
3628800 10
7 3

입출력 예 설명

입출력 예 #1

  • 10! = 3,628,800입니다. n이 3628800이므로 최대 팩토리얼인 10을 return 합니다.

입출력 예 #2

  • 3! = 6, 4! = 24입니다. n이 7이므로, 7 이하의 최대 팩토리얼인 3을 return 합니다.

<제출답안>

 

function solution(n) {
    let fac = 1; // 팩토리얼
    for(let k=1; k<n; k++){
        fac = fac*k
        if(fac >= n){ // fac이 n이상이 됬을 경우의 k값을 구함.
            return fac==n? k: k-1
        }
    }   
}

자꾸 실패가 뜬다. 왜그런지 했다. 빠져먹은 값이 있나 싶어

// n보다 작거나 같은 가장큰 팩토리를 구해야함.
//1   n=1 같아야함
//2 2! 같아야함.
//3 3! 3을 넘기려면 3팩이 필요. 2!이 제일 큼
//4 3! 4를 넘기려면 3팩 -> 2!이 제일 큼
//5 3! 5를 넘기려면 3팩 -> 2!이 제일 큼
//6 3! 6을 넘기려면 3팩 -> 3!이 제일 큼
//7 4! 7을 넘기려면 4팩 -> 3!이 제일 큼

이런식으로 표도 만들어보았는데 그래도 맞았다.

실패 (0.03ms, 33.5MB)
테스트 2 실패 (0.03ms, 33.4MB)
테스트 3 실패 (0.03ms, 33.5MB)
테스트 4 통과 (0.03ms, 33.5MB)
테스트 5 통과 (0.03ms, 33.4MB)
테스트 6 통과 (0.03ms, 33.5MB)

원인은 반복문을 너무 많이 돌려서 시간초과가 뜬것. 코드 자체는 문제가 없었다.

시간초과 때문에 3일을 뻘짓해도 몰라서 답을 봤는데 다들 똑같길래 뭔가 싶었더니 반복횟수를 줄이니 바로 통과되더라...

unction solution(n) {
    let fac = 1; // 팩토리얼
    for(let k=1; k<11; k++){
        fac = fac*k
        if(fac >= n){ // fac이 n이상이 됬을 경우의 k값을 구함.
            return fac==n? k: k-1
        }
    }   
}