Post

분할 정복 (Divide and Conquer)

분할 정복 (Divide and Conquer)

개요

분할 정복(Divide and Conquer)은 복잡한 문제를 더 작고 관리하기 쉬운 하위 문제로 분할하여 해결하는 알고리즘 설계 패러다임입니다. 이 방법은 문제를 분할하고, 각 부분을 개별적으로 해결한 다음, 그 결과를 합쳐 전체 문제의 해결책을 얻습니다.

특징

  • 문제 분할: 큰 문제를 여러 하위 문제로 나눕니다.
  • 정복: 각 하위 문제를 독립적으로 해결합니다.
  • 결합: 하위 문제의 해결책을 결합하여 전체 문제의 해결책을 도출합니다.

  • 방법: 문제를 더 작고 관리하기 쉬운 하위 문제로 나누고, 이를 독립적으로 해결한 다음, 그 결과를 결합하여 전체 문제의 해를 도출합니다.
  • 하위 문제: 각 하위 문제는 독립적이며, 서로 겹치지 않습니다.
  • 적용 예: 병합 정렬(Merge Sort), 퀵 정렬(Quick Sort), 이진 탐색(Binary Search) 등.
  • 효율성: 중복된 하위 문제가 없기 때문에, 한 번 계산된 하위 문제를 다시 계산할 필요가 없습니다.

예시: 병합 정렬 (Merge Sort)

병합 정렬은 분할 정복 알고리즘의 전형적인 예입니다. 이 알고리즘은 배열을 반으로 나누고, 각 부분을 재귀적으로 정렬한 다음, 정렬된 부분 배열들을 병합하여 전체 배열을 정렬합니다.

코드 예시 (Python)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
def merge_sort(arr):
    if len(arr) > 1:
        mid = len(arr) // 2
        L = arr[:mid]
        R = arr[mid:]

        merge_sort(L)
        merge_sort(R)

        i = j = k = 0

        # Merge the two halves
        while i < len(L) and j < len(R):
            if L[i] < R[j]:
                arr[k] = L[i]
                i += 1
            else:
                arr[k] = R[j]
                j += 1
            k += 1

        # Checking if any element was left
        while i < len(L):
            arr[k] = L[i]
            i += 1
            k += 1

        while j < len(R):
            arr[k] = R[j]
            j += 1
            k += 1

    return arr

# 예시: 배열 정렬
example_array = [12, 11, 13, 5, 6, 7]
sorted_array = merge_sort(example_array)
print("Sorted array:", sorted_array)

이 코드는 주어진 배열을 반으로 나누고, 각 부분을 재귀적으로 정렬한 후, 정렬된 부분 배열들을 병합하여 전체 배열을 정렬합니다.

This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.