분할 정복 알고리즘
- 분할정복 알고리즘
- divide and conguer
- 주어진 문제를 최소단위로 분할하여 문제를 분할하는 방법
- 나폴레옹의 아우스터리스 전투에서 사용한 전략에서 유래
- 분할 (문제를 하나 이상의 작은 단위로 나누기) → 정복 (하나씩 해결) → 통합
| 재귀방식 | 분할정복 알고리즘 |
![]() |
![]() |
- 이진탐색 (Binary Search)
- 이진탐색을 위하여 정렬된 자료를 배열에 저장한다
- 탐색하고자 하는 값을 변수에 저장한다
- 배열 내의 중간값을 찾는다
- 중간값과 변수에 저장된 특정 값을 비교한다
- 작으면 앞, 크면 뒤에서 값 비교
- 위 과정을 반복한다.

- 빠른 정렬 Quick Sort
- 기준(pivot)을 정해 그보다 작은 값은 왼쪽, 큰 값은 오른쪽으로 분할하여 정렬을 반복하는 방식 (분할 정복 방식
- 선택정렬보다 빠르며, 정렬 알고리즘 중 가장 많이 사용되는 방법 중 하나
- 재귀적으로 정렬을 수행하며 평균 시간복잡도는 매우 우수하지만 최악의 경우(이미 정렬된 경우 등)에는 O(n^2) 시간 발생 가능
| 실행 과정 | 예시 | 8 4 7 3 5 | ![]() |
| ***기준값(pivot)을 설정 → 이미 정렬된 배열 부분의 내용과 자신의 값을 비교 → 자신의 위치 찾아 삽입 = 재귀적으로 정렬 완료 될 때까지 반복 |
1) 기준값(pivot) 설정 | 8 4 7 3 5 | |
| 2) 작은 값은 왼쪽, 큰 값은 오른쪽으로 분할 | 4 3 (5 기준) 8 7 | ||
| 3) 왼쪽 그룹에 대해 다시 퀵정렬 | [3] 4 (3기준) | ||
| 4) 오른쪽 그룹에 대해 다시 퀵정렬 | [7] 8 (7기준) | ||
| 5) 전체 정렬 결과 병합 | 3 4 5 7 8 |
***기준값(pivot)을 설정 방법 (첫번째 요소(0), 마지막 요소(n-1), 중간요소(n/2), 무작위, 처음-중간-끝 중 중앙값)
이분탐색 알고리즘
- 분할정복 알고리즘
| 정렬 단계 | 탐색 단계 | 단순 설계 단계 | 분할 적용 알고리즘 | 그리디 설계절차 | 문제해결 단계 |
| 기준 ↓ 비교 ↓ 이동 |
기준 ↓ 비교 ↓ 찾기 |
구조화 ↓ 모든 경우 적용 ↓ 해결책 선택 |
분할 ↓ 정복 ↓ 통합 |
선정과정 ↓ 적정성 점검 ↓ 해답점검 |
나누기 ↓ 답구하기 ↓ 답 이용 (상위 → 전체) |
- 파이썬 코드 예시
def binary_search(lst, target):
first = 0
last = len(lst) - 1
found = -1
while first <= last and found == -1:
mid = (first + last) // 2
if list[mid] == target:
found = mid
elif list[mid] > target:
last = mid - 1
else:
first = mid + 1
if found == -1:
print(f"이분탐색 실패: {target} 없음")
return False
else:
print(f"{mid} 인덱스에서 {target} 찾음!")
return True
# 테스트
list = [6, 13, 14, 25, 37]
print(binary_search(lst, 33))
- C++ 코드 예시항목 설명
#include <iostream>
#include <vector>
using namespace std;
bool binary_search(const vector<int>& lst, int target) {
int first = 0;
int last = lst.size() - 1;
int found = -1;
while (first <= last && found == -1) {
int mid = (first + last) / 2;
if (lst[mid] == target) {
found = mid;
} else if (lst[mid] > target) {
last = mid - 1;
} else {
first = mid + 1;
}
}
if (found == -1) {
cout << "이분탐색 실패: " << target << " 없음" << endl;
return false;
} else {
cout << found << " 인덱스에서 " << target << " 찾음!" << endl;
return true;
}
}
int main() {
vector<int> lst = {6, 13, 14, 25, 37};
binary_search(lst, 33);
return 0;
}
| 목적 | 정렬된 리스트에서 원하는 값을 빠르게 찾기 |
| 시간복잡도 | O(log n) |
| 전제 조건 | 리스트가 정렬되어 있어야 함 |
| 동작 방식 | 중간 값을 기준으로 반씩 범위를 줄이며 탐색 |
'이론공부 > 문제해결, 알고리즘' 카테고리의 다른 글
| 함수 (0) | 2025.06.24 |
|---|---|
| 다양한 알고리즘 기법 / 단순하게 문제풀기 (1) | 2025.06.21 |
| 자료탐색 알고리즘 (2) | 2025.06.21 |
| 그리디 알고리즘 (0) | 2025.06.21 |
| 자료정렬 알고리즘 (0) | 2025.06.20 |


