분할 정복이란?
분할 정복으로 통칭하는 이 패러다임은 한 문제를 유형이 비슷한 여러 개의 하위 문제로 나누어 재귀적으로 해결하고 이를 합쳐 원래 문제를 해결한다. 분할 정복 방식이 하위 문제를 재귀적으로 해결하기 때문에 하위 문제 각각은 원래 문제보다 범위가 작아야 하며 하위 문제는 각 문제마다 탈출 조건이 존재해야 한다. 분할 정복 알고리즘을 이해하기 위해 다음과 같이 세 부분으로 나눠서 생각해보자.
- 분할(divide): 문제가 분할이 가능한 경우 2개 이상의 하위 문제로 나눈다.
- 정복(conquer): 하위 문제가 여전히 분할 가능하면, 또 다시 분할을 수행한다. 그렇지 않으면 문제를 푼다.
- 합치기(combine): 정복한 하위 문제들의 답을 합쳐서 원래 문제를 해결하자.
- 문제를 제대로 나누면 conquer하는 것은 쉽기 때문에 divide를 제대로 하는 것이 가장 중요.
- 분할정복 알고리즘은 재귀 알고리즘이 많이 사용되는데, 이 부분에서 분할정복 알고리즘의 효율성을 깎아내릴 수 있다.
분할 정복 알고리즘의 단계를 분할, 정복, 합치기 세 개로 나누면 쉽게 기억할 수 있다. 분할 단계에서 하위 문제가 두 개 생긴다고 가정하면 이 알고리즘은 아래 그림으로 정리할 수 있다. (일부 분할 정복 알고리즘은 하위 문제 두 개 이상으로 이루어질 수 있다.)


분할 정복 알고리즘은 최소한 두 개의 하위 문제를 생성하므로 여러번 재귀 호출을 한다.
'Algorithm > 분할정복' 카테고리의 다른 글
| [Java] 프로그래머스 - 쿼드압축 후 개수 세기(lv.2) (0) | 2023.11.01 |
|---|---|
| 백준 1074-Z (파이썬) (0) | 2022.09.30 |
| 백준 2630-색종이 만들기 (0) | 2022.09.28 |
| 백준 1780-종이의 개수 (파이썬, 자바) (0) | 2022.09.28 |