ALGORITHM/PROGRAMMERS

[프로그래머스] 피보나치 수

0298 2021. 7. 30. 18:21

https://programmers.co.kr/learn/courses/30/lessons/12945

 

코딩테스트 연습 - 피보나치 수

피보나치 수는 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) =

programmers.co.kr

2021-07-30


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
    public int[] dp;
    public int solve(int n) {
        if(dp[n] != 0return dp[n];
        
        dp[n] = (solve(n-1)% 1234567+ (solve(n-2) % 1234567);
        return dp[n] % 1234567;
    }
    public int solution(int n) {
        dp = new int[n+1];
        dp[0= 0;
        dp[1= 1;
        dp[2= 1;
        return solve(n);
    }
}
cs

#문제풀이

메모이제이션을 이용하여 풀었다. O(N)


재미로 다른 방법으로 풀어본다면,

 

다음과 같이 단순 재귀로 풀면

1
2
3
4
5
6
7
8
9
10
11
12
class Solution {
    public int solve(int n) {
        if(n == 0return 0;
        else if(n == 1return 1;
        else if(n == 2return 1;
        
        return ((solve(n-1) % 1234567+ (solve(n-2) % 1234567)) % 1234567;
    }
    public int solution(int n) {
        return solve(n);
    }
}
cs

 O(2^N)으로 7번 테스트부터 시간초과가 난다.

 

 

Bottom-up 방식으로 풀면,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
    public int solution(int n) {
        int fn1 = 1;
        int fn2 = 0
    
        int answer = 0;
        for(int i = 2; i <= n; i++) {
            answer = (fn1 % 1234567+ (fn2 % 1234567);
            fn2 = fn1;
            fn1 = answer;
        }
        
        return answer % 1234567;
    }
}
cs

O(N)이다. 귀찮아서 배열은 만들지 않고, fn1, fn2 변수에다가 값을 저장했다.