1. 동적 계획법 (Dynamic Programming)
입력 크기가 작은 부분 문제들을 해결한 후 이 해를 활용해서 큰 크기의 부분 문제를 해결, 최종적으로 전체 문제를 해결하는 알고리즘
상향식 접근법, 가장 최하위 해답을 구한 후 이를 저장하고 해당 결과값을 이용해 상위 문제를 풀어가는 방식
Memoization 기법 사용
Memoization (메모이제이션) : 프로그램 실행 시 이전에 계산한 값을 저장, 다시 계산하지 않도록 전체 실행 속도를 빠르게
문제를 잘게 쪼갤 때, 부분 문제는 서로 중복됨, 재활용
2. 분할 정복 (Divide and Conquer)
문제를 나눌 수 없을 때까지 나누어서 각각을 풀면서 다시 합병하여 문제를 답을 얻는 알고리즘
하양식 접근법, 상위의 해답을 구하기 위해 아래로 내려가면서 하위의 해답을 구하는 방식
재귀함수로 구현
문제를 잘게 쪼갤 때, 부분 문제는 서로 중복되지 않음
3. 공통점과 차이점
공통점
- 문제를 잘게 쪼개서 가장 작은 단위로 분할
차이점
- 동적 계획법 : 부분 문제는 중복되어 상위 문제 해결 시 재활용, Memoization 기법 사용
- 분할 정복 : 부분 문제는 서로 중복되지 않음, Memoization 기법 사용 안함
4. 피보나치 수열을 동적 계획법으로 작성
import java.util.*;
public class DynamicProgramming {
public static void dynamicProgramming() {
for (int i = 1; i < 10; i++) {
System.out.println(fibo(i));
}
}
//1. 재귀 활용
public Integer fibo(Integer num) {
if (num <= 1) {
return num;
}
return fibo(num - 1) + fibo(num - 2);
}
//2. 동적 프로그래밍 활용
public Integer fiboDp(Integer num) {
int[] cache = new int[num];
cache[0] = 0;
cache[1] = 1;
for (int i = 2; i < num + 1; i++) {
cache[i] = cache[i - 1] + cache[i - 2];
}
return cache[num];
}
}
'Algorithm > 알고리즘' 카테고리의 다른 글
너비 우선 탐색 (BFS) (0) | 2023.01.23 |
---|---|
그래프(Graph) (0) | 2023.01.23 |
재귀 용법 (recursive call) (0) | 2023.01.20 |
선택 정렬 (selection sort) (0) | 2023.01.19 |
삽입 정렬 (insertion sort) (0) | 2023.01.19 |