csmoon1010의 SW 블로그

[200904] 피보나치 수 - 연습문제(level2) 본문

Coding Test/프로그래머스

[200904] 피보나치 수 - 연습문제(level2)

csmoon1010 2020. 9. 4. 22:53

1. 문제 이해

- 피보나치 수의 정의

: F(0) = 0, F(1) = 1일 때, F(n) = F(n-1) + F(n-2)가 적용되는 수

ex> 0 1 1 2 3 5 8 13 . . . 

- n번째 피보나치 수를 1234567로 나눈 나머지를 리턴

 

 

2. 전략

(1) 첫번째 시도 : 재귀함수를 이용

    int Fibonacci(n){
        if(n == 0) return 0;
        else if(n==1) return 1;
        else    return Fibonacci(n-1) + Fibonacci(n-2);
    }

- 문제점 : 불필요한 중복 계산이 들어감(Fibonacci(n-1)을 구할 때 Fibonacci(n-2)를 한 번 더 구함)

              →  시간 초과

 

(2) 두번째 시도 : int 배열에 0~n번째 피보나치 수를 차례로 저장

- 작은 문제부터 푸는 "상향식 Dynamic Programming"

- 단, 1234567로 나눈 결과이므로 각 피보나치 수를 저장할 때 나눗셈 연산(%) 진행

 

※ 1234567로 나누는 과정이 필요한 이유

- n이 커질수록 피보나치 수는 급격히 증가 → 데이터 타입의 범위를 벗어남 → 잘못된 결과

- n 이전부터 결과가 잘못될 수도 있으니 각 피보나치수를 구할 때 1234567로 나눠줘야 됨

 

 

3. 참고 사항

 

4. 코드

class Solution {
    public int solution(int n) {
        int answer = 0;
        int[] save = new int[n+1];
        save[0] = 0; save[1] = 1;
        for(int i = 2; i <n+1; i++){
            save[i] = (save[i-2] + save[i-1]) % 1234567;
        }
        answer = save[n];
        return answer;
    }
}
Comments