🔗 백준 2747 - 피보나치 수
문제

알고리즘 분류
풀이
처음 시도했던 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
System.out.println(fibo(n));
}
public static int fibo(int n){
if(n == 0) return 0;
if(n == 1) return 1;
return fibo(n-1) + fibo(n-2);
}
}
1. dp 선언 및 초기화
- int 배열을 선언하고,
- 피보나치 수열에서 f(0) = 0, f(1) = 1이므로 배열에 저장하고, 나머지는 -1로 초기화
static int[] dp;
...
dp = new int[n+1];
dp[0] = 0; dp[1] = 1;
for(int i = 2; i<=n; i++){
dp[i] = -1;
}
dp[n] = fibo(n);
2. 함수 구현
- 배열에 값이 저장되어있지 않다면 재귀를 통해 계산하여 저장
public static int fibo(int n){
if(dp[n] == -1){
dp[n] = fibo(n-1) + fibo(n-2);
}
return dp[n];
}
전체 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
static int[] dp;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
dp = new int[n+1];
dp[0] = 0; dp[1] = 1;
for(int i = 2; i<=n; i++){
dp[i] = -1;
}
dp[n] = fibo(n);
System.out.println(dp[n]);
}
public static int fibo(int n){
if(dp[n] == -1){
dp[n] = fibo(n-1) + fibo(n-2);
}
return dp[n];
}
}
- 피보나치 응용은 풀어봤지만 기본 문제를 안 풀어봐서 골랐는데.. 응용 풀어봤으면 굳이 안 풀어봐도 될 듯