[Node.js_4기] 코드카타 : 피보나치 수열 (24/02/26)

2024. 2. 26. 09:20공부/코테준비

목차

 

1. 문제

2. 시도

3. 결과

4. 배운점

 

1. 문제 

 

코딩테스트 연습 - 피보나치 수 | 프로그래머스 스쿨 (programmers.co.kr)

 

- 문제 설명
피보나치 수는 F(0) = 0, F(1) = 1일 때, 1 이상의 n에 대하여 F(n) = F(n-1) + F(n-2) 가 적용되는 수 입니다.
예를들어
F(2) = F(0) + F(1) = 0 + 1 = 1
F(3) = F(1) + F(2) = 1 + 1 = 2
F(4) = F(2) + F(3) = 1 + 2 = 3
F(5) = F(3) + F(4) = 2 + 3 = 5
와 같이 이어집니다.
2 이상의 n이 입력되었을 때, n번째 피보나치 수를 1234567으로 나눈 나머지를 리턴하는 함수, solution을 완성해 주세요.

- 제한 사항
n은 2 이상 100,000 이하인 자연수입니다.
입출력 예

 

2. 시도 

function solution(n) {
    let answer = 0;
    let f0 = 0;
    let f1 = 1;
    for(let i = 2; i <= n;i++){
        answer = f0+f1
        f0=f1;
        f1=answer;
    }
    return answer%1234567;
}

쉽구만.

테스트 1 통과 (0.03ms, 33.4MB)
테스트 2 통과 (0.03ms, 33.4MB)
테스트 3 통과 (0.03ms, 33.4MB)
테스트 4 통과 (0.05ms, 33.5MB)
테스트 5 통과 (0.05ms, 33.5MB)
테스트 6 통과 (0.06ms, 33.4MB)
테스트 7 실패 (0.08ms, 33.4MB)
테스트 8 실패 (0.06ms, 33.4MB)
테스트 9 실패 (0.08ms, 33.5MB)
테스트 10 실패 (0.14ms, 33.4MB)
테스트 11 실패 (0.09ms, 33.5MB)
테스트 12 실패 (0.06ms, 33.4MB)
테스트 13 실패 (2.61ms, 37.5MB)
테스트 14 실패 (3.93ms, 37.4MB)

어째서...?

 

-> 피보나치 수는 매우 빠르게 증가하기 때문에 매우 큰 숫자(ex 10만번째 피보나치 수)가 등장할 경우 오버플로우가 발생.

 

3. 결과 

 

function solution(n) {
    let answer = 0;
    let f0 = 0;
    let f1 = 1;
    for(let i = 2; i <= n;i++){
        answer = (f0+f1)%1234567;
        f0=f1;
        f1=answer;
    }
    return answer;
}

1234567을 나누는 이유 = 오버플로우 방지

 

4. 배운점 

 

문제풀이 자체는 어렵지 않았으나, 오버플로우를 생각하지 못하고 있었다.