알고리즘Medium#192
분할 정복(Divide and Conquer)의 기본 아이디어를 설명해주세요.
#알고리즘#DivideAndConquer#재귀#정렬
답변 포인트
분할, 정복, 병합 단계를 기준으로 정의, 장점, 한계, 예시를 함께 설명해보세요.
정답 및 해설
빠른 요약
분할 정복은 문제를 작은 부분 문제로 나누고 각각 해결한 뒤 결과를 합칩니다. 병합 정렬, 퀵 정렬, 이진 탐색이 대표 예시입니다.
분할 정복은 큰 문제를 더 작은 독립적인 하위 문제로 나누고, 각각을 해결한 뒤 결과를 합쳐 전체 문제를 푸는 알고리즘 설계 기법입니다. divide, conquer, combine 세 단계로 생각하면 이해하기 쉽습니다.
핵심 개념
- Divide: 문제를 비슷한 크기의 부분 문제로 나눕니다.
- Conquer: 부분 문제가 충분히 작아질 때까지 재귀적으로 해결합니다.
- Combine: 부분 결과를 합쳐 원래 문제의 답을 만듭니다.
동작 방식 또는 판단 기준
이 주제를 이해할 때는 다음 순서로 보면 실무 적용이 쉬워집니다.
- 무엇을 해결하려는가: 성능, 표현력, 안정성, 접근성 중 어떤 문제를 줄이려는지 확인합니다.
- 전제 조건은 무엇인가: 정렬 여부, 브라우저 지원, 네트워크 특성, 동시성 조건처럼 성립해야 하는 조건을 점검합니다.
- 비용은 어디서 발생하는가: 시간 복잡도, 메모리, 캐시, 재시도, 렌더링 비용처럼 병목 지점을 나눠 봅니다.
- 실패 시 어떤 문제가 생기는가: 잘못 적용했을 때의 버그나 운영 리스크를 함께 고려합니다.
실제 예시
JavaScript
function mergeSort(arr) {
if (arr.length <= 1) return arr;
const mid = Math.floor(arr.length / 2);
const left = mergeSort(arr.slice(0, mid));
const right = mergeSort(arr.slice(mid));
return merge(left, right);
}
function merge(a, b) {
const result = [];
let i = 0, j = 0;
while (i < a.length && j < b.length) {
result.push(a[i] <= b[j] ? a[i++] : b[j++]);
}
return result.concat(a.slice(i), b.slice(j));
}실무에서 주의할 점
- 부분 문제가 독립적이지 않고 많이 겹치면 분할 정복보다 DP가 더 적합할 수 있습니다.
- 재귀 깊이와 임시 배열 생성 비용이 커질 수 있습니다.
- Combine 단계가 비싸면 전체 복잡도가 예상보다 커집니다.
실무 적용 가이드
- 정렬, 이진 탐색, 빠른 거듭제곱, closest pair 문제 등에서 사용됩니다.
- 점화식
T(n) = aT(n/b) + f(n)으로 시간 복잡도를 분석합니다. - 큰 입력에서는 재귀 대신 반복 구현이나 tail risk를 고려합니다.
함께 연결해서 보면 좋은 키워드
Divide and Conquer, Merge Sort, Recursion, Algorithm Design
정리
분할 정복은 큰 문제를 더 작은 독립적인 하위 문제로 나누고, 각각을 해결한 뒤 결과를 합쳐 전체 문제를 푸는 알고리즘 설계 기법입니다. 다만 개념 자체보다 중요한 것은 적용 조건과 한계를 함께 이해하는 것입니다. 작은 예제에서는 단순해 보여도 실제 서비스에서는 성능, 보안, 유지보수성, 접근성 요구사항이 함께 얽히므로, 문제의 성격을 먼저 파악한 뒤 적절한 도구로 선택하는 것이 좋습니다.