알고리즘
[알고리즘] 동적 계획법, 분할정복
감자b
2024. 12. 28. 00:16
동적 계획법 (DP)
- 입력 크기가 작은 부분 문제들을 해결하고, 해당 부분 문제의 해를 활용하여 보다 큰 크기의 부분 문제를 해결, 최종적으로 전체 문제를 해결하는 알고리즘이다.
- 상향식 접근법으로, 가장 최하위 해답을 구한 후, 이를 저장하고 해당 결과를 이용해서 상위 문제를 풀어나감
- Memoization 기법을 사용해서 이전에 계산한 값을 저장, 재활용해서 실행 속도를 빠르게 한다.
public static int fibonacci(int n) {
Integer[] memoization = new Integer[n + 1];
memoization[0] = 0;
memoization[1] = 1;
for (int i = 2; i < n + 1; i++) {
memoization[i] = memoization[i - 1] + memoization[i - 2];
}
return memoization[n];
}
분할 정복
- 문제를 나눌 수 없을 때 까지 나누어서 각각을 풀고 다시 합병해서 문제를 해결
- 하향식 접근법으로, 상위의 해답을 구하기 위해, 아래로 내려가면서 하위의 해답을 구함 (재귀)
- 문제를 잘게 쪼갤 때, 부분 문제는 서로 중복되지 않는다.
public static int fibonacci(int n) {
if (n <= 1) {
return n;
}
return fibonacci(n - 1) + fibonacci(n - 2);
}