알고리즘
[알고리즘] 동적계획법(DP)과 분할정복(DC)
김긍수
2021. 3. 2. 16:43
동적계획법 (Dynamic Programming)과 분할정복 (Divide and Conquer)
1. 정의
동적계획법 (DP)
- 입력 크기가 작은 부분 문제들을 해결한 후, 해당 부분 문제의 해를 활용해서 보다 큰 크기의 부분 문제를 해결하고 최종적으로 전체 문제를 해결하는 알고리즘입니다.
- 상향식 접근법으로 가장 최하위 해답을 구한 후, 이를 저장하고 해당 결과값을 이용해서 상위 문제를 풀어가는 방식입니다.
- Memoization 기법을 사용합니다.
- Memoization 이란, 프로그램 실행 시 이전에 계산한 값을 저장하여 다시 계산하지 않도록 하여 전체 실행속도를 빠르게 하는 기술입니다.
- 문제를 쪼갤 때 부분 문제는 중복되어 재활용됩니다.
- ex. 피보나치 수열 f(n) = f(n-1) + f(n-2)
분할 정복 (DC)
- 문제를 나눌 수 없을때까지 나누어서 각각을 풀면서 다시 병합하여 문제의 답을 얻는 알고리즘입니다.
- 하향식 접근법으로 상위의 답을 구하기 위해 아래로 내려가면서 하위의 답을 구하는 방식입니다.
- 일반적으로 재귀함수로 구현합니다.
- 문제를 쪼갤 때, 부분문제는 서로 중복되지 않습니다.
- ex. 병합정렬, 퀵정렬
2. 공통점과 차이점
공통점
- 문제를 잘게 쪼개서 가장 작은 단위로 분할합니다.
차이점
- 동적계획법(DP)
- 부분 문제는 중복되어 상위 문제 해결 시 재활용됩니다.
- 메모리제이션 기법을 사용합니다. (부분 문제의 해답을 저장해서 재활용하는 최적화 기법으로 사용)
- 분할정복(DC)
- 부분 문제는 서로 중복되지 않습니다.
- 메모리제이션 기법을 사용하지않습니다.
3. 동적계획법 코드
DP는 메모리제이션 기법을 사용하기때문에 작은 부분 문제의 해답을 메모해두어야합니다.