Krafton Jungle/2. Keywords
[WEEK02] 분할 정복
munsik22
2025. 3. 24. 14:16
📌 분할 정복이란?
분할 정복(Divide and Conquer)은 문제를 작은 하위 문제로 나누고(Divide), 각 하위 문제를 해결한 뒤(Conquer), 그것들을 합쳐서(Merge) 최종적인 결과를 도출하는 알고리즘 설계 기법이다. 주로 재귀를 사용하여 구현된다.
🔥 분할 정복의 핵심 원리
- 분할(Divide): 문제를 더 작은 하위 문제로 나눈다.
- 정복(Conquer): 각 하위 문제를 재귀적으로 해결한다.
- 병합(Merge): 하위 문제의 결과를 결합하여 원래 문제의 해답을 구한다.
📚 대표적인 예제
1. 병합 정렬(Merge Sort)
- 배열을 절반씩 나누어 정렬한 후, 병합하면서 정렬하는 방식
- 시간 복잡도: O(n log n)
def merge_sort(arr):
if len(arr) <= 1:
return arr
mid = len(arr) // 2
left = merge_sort(arr[:mid])
right = merge_sort(arr[mid:])
return merge(left, right)
def merge(left, right):
result = []
i = j = 0
while i < len(left) and j < len(right):
if left[i] < right[j]:
result.append(left[i])
i += 1
else:
result.append(right[j])
j += 1
result.extend(left[i:])
result.extend(right[j:])
return result
arr = [5, 3, 8, 4, 2, 7, 1, 6]
print(merge_sort(arr))
2. 퀵 정렬(Quick Sort)
- 피벗(Pivot)을 설정하고, 피벗을 기준으로 작은 값과 큰 값을 분할하여 정렬하는 방식
- 평균 시간 복잡도: O(n log n), 최악의 경우 O(n^2)
def quick_sort(arr):
if len(arr) <= 1:
return arr
pivot = arr[len(arr) // 2]
left = [x for x in arr if x < pivot]
middle = [x for x in arr if x == pivot]
right = [x for x in arr if x > pivot]
return quick_sort(left) + middle + quick_sort(right)
arr = [5, 3, 8, 4, 2, 7, 1, 6]
print(quick_sort(arr))
3. 이진 탐색(Binary Search)
- 정렬된 배열에서 특정 값을 빠르게 찾는 알고리즘
- 시간 복잡도: O(log n)
def binary_search(arr, target, left, right):
if left > right:
return -1
mid = (left + right) // 2
if arr[mid] == target:
return mid
elif arr[mid] > target:
return binary_search(arr, target, left, mid - 1)
else:
return binary_search(arr, target, mid + 1, right)
arr = [1, 2, 3, 4, 5, 6, 7, 8]
target = 5
print(binary_search(arr, target, 0, len(arr) - 1))
💡 분할 정복 알고리즘의 장점과 단점
✅ 장점
- 문제를 작은 단위로 쪼개어 해결하므로 효율적인 알고리즘 설계 가능
- 정렬, 탐색 등 다양한 문제에 적용 가능
- 병렬 처리에 유리하여 멀티코어 환경에서 성능 향상 가능
❌ 단점
- 재귀 호출이 많아지면 스택 오버플로우(Stack Overflow) 위험
- 하위 문제의 병합 과정에서 추가적인 메모리 사용 가능 (예: 병합 정렬)
- 일부 경우(예: 퀵 정렬에서 피벗을 잘못 선택한 경우) 최악의 시간 복잡도 발생
🎯 정리
분할 정복 알고리즘은 다양한 문제를 해결하는 데 강력한 도구가 될 수 있다. 특히 정렬, 탐색, 행렬 곱셈, 최근접 점 문제 등 여러 분야에서 사용된다. 적절한 알고리즘을 선택하여 효율적인 문제 해결을 해보자.