
https://www.acmicpc.net/problem/1003
재귀로 구현된 피보나치 함수를 사용할 때 종료 조건 fibonacci(0)과 fibonacci(1)이 몇 번 반복되는지 찾는 문제입니다.
언제나 그렇듯 한번 써 봅시다.
피보나치 수를 구하는 함수를 f(n) 이라고 합시다.
f(0) 은 종료 조건이므로 f(0) 1회,f(1) 0회입니다.
f(1) 은 종료 조건이므로 f(0) 0회,f(1) 1회입니다.
f(2) 는 f(1)과 f(0) 을 호출하므로 각각 1회입니다.
... 이런 방법으로 반복하면 아래와 같이 호출 횟수를 확인할 수 있습니다.
| n | fibonacci(0) | fibonacci(1) |
|---|---|---|
| 0 | 1 | 0 |
| 1 | 0 | 1 |
| 2 | 1 | 1 |
| 3 | 1 | 2 |
| 4 | 2 | 3 |
| 5 | 3 | 5 |
| 6 | 5 | 8 |
피보나치 수열이 보이시나요?
f(0) 의 호출 횟수는 n = 0 일 때 1, n 이 1 이상일 때에는 f(n - 1) 이 되고, f(1) 의 호출 횟수는 아예 피보나치 수열을 따르고 있는 것이 보이죠.
따라서 피보나치 수열의 값을 미리 구해 놓고 위 조건에 따라 출력하면 됩니다.
// 피보나치 수열을 미리 구함
int[] fibonacci = new int[40 + 1];
fibonacci[1] = 1;
for (int i = 2; i <= 40; i++)
fibonacci[i] = fibonacci[i - 1] + fibonacci[i - 2];
(...)
for (int i = 0; i < testCase; i++) {
(...)
int fZero, fOne;
if (input == 0) {
fZero = 1;
fOne = 0;
} else {
fZero = fibonacci[input - 1];
fOne = fibonacci[input];
}
(...)
}
(...)
문제가 전부 해결되었습니다.

import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
StringBuilder builder = new StringBuilder();
int[] fibonacci = new int[40 + 1];
fibonacci[1] = 1;
for (int i = 2; i <= 40; i++)
fibonacci[i] = fibonacci[i - 1] + fibonacci[i - 2];
int testCase = Integer.parseInt(reader.readLine());
for (int i = 0; i < testCase; i++) {
int input = Integer.parseInt(reader.readLine());
int fZero, fOne;
if (input == 0) {
fZero = 1;
fOne = 0;
} else {
fZero = fibonacci[input - 1];
fOne = fibonacci[input];
}
builder.append(fZero + " " + fOne + "\n");
}
System.out.print(builder.toString());
}
}