

이번 문제는 점화식과 관련있었던 것 같다.
d[n] = d[n-1] + d[n-2]를 반복하면서 최종적으로
d[0]은 0, d[1] = 1 를 return한다.
0과 1을 호출한 횟수를 각각 구하는 문제이다.
미리 피보나치 메서드를 만들어 놓고,
n의 최대값인 40까지의 경우의 수를 미리 다 구해 놨다.
이후 n의 값에 맞게 각각 출력하는 느낌으로 구현했다.
package test13;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class Ox13_Q2_1 {
static int [] zeroArr, oneArr ;
// 백준 1003 S3
public static void main(String [] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int n = Integer.parseInt(br.readLine());
zeroArr= new int [41]; // n의 최대가 40이므로 +1
oneArr = new int [41];
// n개의 테스트 케이스 실행
for(int i =0; i<n; i++) {
int temp = Integer.parseInt(br.readLine());
fibonacci(); // 모든 경우의 수 미리 계산
// 해당 경우의 수 출력
sb.append(zeroArr[temp] + " " + oneArr[temp] + "\n");
} // for fin
System.out.println(sb.toString().trim());
}
// 모든 경우의 수 미리 구해두기
public static void fibonacci() {
zeroArr[0] = 1;
oneArr[0] = 0;
zeroArr[1] = 0;
oneArr[1] = 1;
for(int i = 2; i<=40; i++) {
zeroArr[i] = zeroArr[i-1] + zeroArr[i-2];
oneArr[i] = oneArr[i-1] + oneArr[i-2];
}
}
}
0의 경우의 수는 zeroArr, 1의 경우의 수는 oneArr 배열에 계속 누적된다.
따라서, zeroArr은 zeroArr[0] = 1, zeroArr[1] = 0이고,
oneArr은 oneArr[0] = 0, oneArr[1] = 1을 지정해주고,
나머지는 문제 그대로 반복하여 해결해주었다.

굿