문제 출처: https://www.acmicpc.net/problem/1003
문제
fibonacci(3)을 호출하면 다음과 같은 일이 일어난다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
    private static int countZero, countOne;
    public static void main(String[] args) throws IOException {
        StringBuilder sb = new StringBuilder();
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(reader.readLine());
        while (T-- > 0) {
            int N = Integer.parseInt(reader.readLine());
            int[] fibo = new int[N + 1];
            int[][] counts = new int[N + 1][2];
            countZero = 0;
            countOne = 0;
            fibonacci(counts, fibo, N);
            sb.append(countZero).append(" ").append(countOne).append("\n");
        }
        System.out.println(sb);
    }
    private static int fibonacci(int[][] counts, int[] nums, int n) {
        if (n == 0) {
            counts[n][0] = 1;
            countZero += counts[n][0];
            return 0;
        }
        if (n == 1) {
            counts[n][1] = 1;
            countOne += counts[n][1];
            return 1;
        }
        if (nums[n] != 0) {
            // n == 2부터
            counts[n][0] = counts[n - 1][0] + counts[n - 2][0];
            counts[n][1] = counts[n - 1][1] + counts[n - 2][1];
            countZero += counts[n][0];
            countOne += counts[n][1];
            return nums[n];
        }
        // 이게 메모이제이션!
        nums[n] = fibonacci(counts, nums, n - 1) + fibonacci(counts, nums, n - 2);
        return nums[n];
    }
}