코딩테스트
백준 1003번 피보나치 함수(자바) - DP
leeeehhjj
2021. 6. 7. 16:28
이 문제는 푸는 게 어렵지는 않지만 시간초과가 자꾸 나와서 푸는데 오래 걸렸다..
일단 fibonacci(0) 과 fibonacci(1)이 호출된 횟수를 각각 구해야 하므로
2차원 배열을 활용하여 n에 대한 f(0), f(1) 횟수를 따로 구할 수 있도록 했다.
또한 재귀를 활용하여 구해야 하므로 fibonacci 함수가 int 배열을 return 하도록 했다.
또, 한 번 구한 dp값은 또 구할 필요가 없도록 하기 위해 dp[num][0]과 dp[num][1] 둘 중 하나 이상이 0인 경우에만
dp값을 구하도록 했다.(n이 2 이상인 경우 dp[n][0] dp[n][1] 값이 0인 경우가 없으므로 dp 값이 0인 경우 이미 한 번 계산된 dp 값으로 판단했다)
import java.util.Scanner;
public class Test {
static int [][] dp = new int[41][2];
public static void main(String args[]) {
Scanner scanner = new Scanner(System.in);
int numOfTestCase = scanner.nextInt();
dp[0][0] = 1;
dp[0][1] = 0;
dp[1][0] = 0;
dp[1][1] = 1;
int n;
for(int i = 0; i < numOfTestCase; i++) {
n = scanner.nextInt();
fibonacci(n);
System.out.println(dp[n][0] + " " + dp[n][1]);
}
}
public static int[] fibonacci(int num) {
if(num > 1) {
if(dp[num][0] == 0 || dp[num][1] == 0) {
dp[num][0] = fibonacci(num - 1)[0] + fibonacci(num - 2)[0];
dp[num][1] = fibonacci(num - 1)[1] + fibonacci(num - 2)[1];
}
}
return dp[num];
}
}