동적 계획법과 분할 정복 - Dynamic Programming & Divide
동적 게획법
복잡한 문제를 간단한 여러개의 문제로 나누어 푸는 방법
- 상향식 접근법으로 가장 최하위 해답을 구하고, 공간을 할당하여 기억하고 해당 결과값을 이용해 상위 문제를 풀어간다.
- 문제를 해결하기 위한 모든 방법을 검토하고, 그 중 최적의 풀이법을 찾아낸다.
- ex. 피보나치 수열
방법
- 입력 크기가 작은 부분 문제들을 해결한다.
- 해당 부분 문제의 해를 활용해서 보다 큰 크기의 부분 문제를 해결한다.
- 최종적으로 전체 문제를 해결한다.
분할 정복 - Divide and conquer
문제를 나눌 수 없을 때까지 나누어 다시 합병하여 문제의 답을 얻는 알고리즘
- 하향식 접근법으로, 상위의 해답을 구하기 위해, 아래로 내려가면서 하위의 해답을 구하는 방식이다.
일반적으로 재귀함수로 구현한다.
- 문제를 잘게 쪼갤 때, 부분 문제는 서로 중복되지 않는다.
병합 정렬, 퀵 정렬 등
공통점과 차이점
공통점
문제를 잘게 쪼개서 가장 작은 단위로 분할한다.
차이점
동적 계획법
- 부분 문제는 중복되어, 상위 문제 해결시 재활용된ㅇ
- Memoization 기법이 사용된다.
분할 정복
- 부분 문제는 서로 중복되지 않는다.
- Memoization 기법은 사용되지 않는다.