반응형
문제
문제 탐색하기
1. 동적 계획법이란
Dynamic Programing, 줄여서 DP라고 하며, DP 알고리즘 기법은 이미 계산된 결과(하위 문제)는 별도의 메모리 영역에 저장해서 다시 계산하지 않도록 설계함으로써 메모리를 적절히 사용할 수 있도록 하는 방법입니다.
동적계획법은 크게 재귀(Top-Down) 방식, 반복문(Bottom-Up) 방식이 있습니다. 이번 문제는 Bottom-Up방식을 사용해보려 합니다.
Bottom-Up 방식은 하위에서부터 문제를 해결해나가면서 먼저 계산했던 문제의 값을 활용하여 상위 문제를 해결해나가는 방식으로 DP의 전형적인 형태입니다. 이전 피보나치 수를 통해서 다음 피보나치 수를 계산해나가는 형태로 문제를 풀면 될 것 같습니다.
2. 시간복잡도
피보나치 수를 나열해보았을 때 0번째 수와 1번째 수를 제외하고 2번째 수부터는 바로 앞 두 개의 피보나치 수의 합이 되는 것이 반복됩니다.
배열에 피보나치 수를 저장하고 이를 통해서 계산하는 방식이기에 시간복잡도는 O(n)이며, n이 최대 90까지 입력을 받을 수 있기때문에 시간 내에 충분히 연산가능할 것이라 생각합니다.
코드 설계하기
- 숫자 N 입력 (자연수 , 1<= n <= 90)
- 피보나치 수는 0번째부터 나열하므로 배열은 N+1의 원소를 저장할 수 있도록 선언
- 피보나치 수 배열에 입력
- 0번째와 1번째 피보나치 수는 초기값 입력
- 2번째 피보나치 수 부터 바로 앞 두 피보나치 수를 합하는 연산을 진행
- N번째 피보나치 수를 배열에서 찾아서 출력
정답코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Fibonacci {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
// 1. 숫자 N 입력 (자연수, 1 <= N <= 90)
int N = Integer.parseInt(reader.readLine());
// 4. N번째 피보나치 수 출력
System.out.println(function(N));
}
private static long function(int N){
if(N <= 1) return N;
// 2. N = 3일 경우 0, 1, 2, 3 총 4개의 피보나치 수가 저장되어야하므로 배열은 N+1로 생성
long[] fibonacci = new long[N+1];
fibonacci[0] = 0;
fibonacci[1] = 1;
// 3. 피보나치 수 배열에 입력
for(int i=2; i<=N; i++){
// # 2번째 피보나치 수부터 아래와 같은 연산을 진행해서 저장
fibonacci[i] = fibonacci[i-2] + fibonacci[i-1];
}
return fibonacci[N];
}
}
반응형
'코딩테스트 챌린지' 카테고리의 다른 글
[코딩테스트 챌린지] 백준 1010 다리 놓기 (java) (0) | 2024.09.19 |
---|---|
[코딩테스트 챌린지] 백준 2775 부녀회장이 될테야 (java) (0) | 2024.09.18 |
[코딩테스트 챌린지] 백준 1568 덩치 (java) (0) | 2024.09.15 |
[코딩테스트 챌린지] 백준 2947 나무조각 (java) (1) | 2024.09.14 |
[코딩테스트 챌린지] 백준 25305 커트라인 (java) (0) | 2024.09.13 |