문제 정보

풀이

피보나치 수를 구하는 함수를 재귀 방식과 DP 방식 각각으로 구현하면 되는 문제다.

추가로, DP 방식으로 구현할 때 길이 n의 배열을 사용했는데 사실 길이 2의 배열로도 계산할 수 있다. 피보나치 수의 점화식 f(n) = f(n - 1) + f(n - 2)에서 현재 값을 구하는 데 직전 2개의 값만 필요하기 때문이다.

int[] dp = new int[2];
dp[0] = 0;
dp[1] = 1;
 
for (int i = 2; i <= n; i++) {
    int next = dp[0] + dp[1];
    dp[0] = dp[1];
    dp[1] = next;
}
 
return dp[1];

코드

import java.io.*;
import java.util.*;
 
public class Main
{
    private static int code1Cnt;
    private static int code2Cnt;
    public static void main(String[] args) throws IOException {
        code1Cnt = code2Cnt = 0;
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        int n = Integer.parseInt(br.readLine());
        
        fib(n);
        fib_DP(n);
        
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        
        bw.write(code1Cnt + " " + code2Cnt + "\n");
        bw.flush();
        bw.close();
    }
    
    private static int fib(int n) {
        if (n == 1 || n == 2) {
            code1Cnt++;
            return 1;
        }
        return fib(n - 1) + fib(n - 2);
    }
    
    private static int fib_DP(int n) {
        int[] dp = new int[n + 1];
        dp[1] = dp[2] = 1;
        
        for (int i = 3; i <= n; i++) {
            code2Cnt++;
            dp[i] = dp[i - 1] + dp[i - 2];
        }
        
        return dp[n];
    }
}