728x90
반응형
개요
그리디(Greedy) 알고리즘은 문제 해결 과정에서 매 순간 가장 좋아 보이는 선택(최적의 선택)을 하는 전략이다. 각 단계의 선택이 이후의 선택에 영향을 주지 않는 문제, 즉 **탐욕적 선택 속성(Greedy Choice Property)**과 **최적 부분 구조(Optimal Substructure)**를 만족하는 문제에 효과적이다. 빠르고 구현이 간단하며, 다양한 최적화 문제에서 널리 활용된다.
1. 개념 및 정의
그리디 알고리즘의 핵심은 다음과 같다:
- 현재 단계에서 가장 이득이 크거나 비용이 적은 선택을 한다.
- 과거의 선택과 무관하게 현재 선택이 전체 최적해에 포함된다고 가정한다.
- 전체 문제를 한 번의 탐색으로 해결할 수 있다.
단점은 항상 최적의 해를 보장하지 않는다는 것이다.
2. 알고리즘 동작 구조
단계 | 설명 |
1 | 문제를 구성 요소로 나눈다 |
2 | 현재 가능한 선택 중 가장 좋은 것을 고른다 (Greedy Choice) |
3 | 선택된 항목을 확정하고 다음 단계로 이동한다 |
4 | 전체 선택이 끝날 때까지 반복한다 |
그리디 알고리즘은 보통 반복문 또는 우선순위 큐로 구현된다.
3. 대표 알고리즘 및 문제 예시
알고리즘/문제 | 설명 | 사용 전략 |
거스름돈 문제 | 가장 큰 단위부터 거슬러주기 | 큰 동전 우선 선택 |
회의실 배정 | 종료 시간이 빠른 회의 우선 배정 | 우선순위 정렬 |
Kruskal 최소 신장 트리 | 간선의 가중치가 낮은 순으로 선택 | 정렬 + 유니온 파인드 |
Prim 최소 신장 트리 | 가까운 노드부터 연결 | 우선순위 큐 |
Fractional Knapsack | 비율이 가장 높은 물건부터 담기 | 정렬 + 부분 선택 |
4. 파이썬 간단 구현 예 (거스름돈 문제)
def greedy_change(coins, target):
coins.sort(reverse=True)
count = 0
for coin in coins:
while target >= coin:
target -= coin
count += 1
return count
# 사용 예시
print(greedy_change([500, 100, 50, 10], 1260)) # 출력: 6
5. 시간 및 공간 복잡도
항목 | 복잡도 |
시간 복잡도 | O(n log n) (정렬 포함) 또는 O(n) |
공간 복잡도 | O(1) 또는 O(n) (우선순위 큐 사용 시) |
정렬 기반 문제는 n log n, 탐욕 선택만 있으면 O(n)에 해결 가능하다.
6. 시각적 예시: 회의실 배정 문제
입력: 회의 시작/종료 시간 목록 → (1,4), (3,5), (0,6), (5,7), (8,9), (5,9)
- 종료 시간 기준으로 정렬
- 선택: (1,4) → (5,7) → (8,9) → 최대 3개 회의 가능
7. 그리디 vs 동적 프로그래밍
항목 | 그리디 알고리즘 | 동적 프로그래밍 |
접근 방식 | 현재 최선 선택 | 모든 경우 비교 후 최선 선택 |
메모리 사용 | 적음 | 높음 (DP 테이블 필요) |
적용 문제 | 최적 부분 구조 + 탐욕 선택 속성 | 중복 부분 문제 + 최적 부분 구조 |
예시 | 회의실 배정, Kruskal, Prim | 피보나치, 배낭 문제(0-1 Knapsack) |
8. 활용 분야
분야 | 적용 예시 |
네트워크 | 최소 비용 네트워크 구성 (MST) |
자원 스케줄링 | 회의실, 강의실, CPU 프로세스 배정 |
물류/배달 | 최소 이동거리, 물류 경로 구성 |
수학 문제 풀이 | 최소 동전 문제, 최대 이익 선택 |
9. 결론
그리디 알고리즘은 현재 상황에서 가장 좋은 선택을 반복하여 전체 최적해를 추구하는 방식으로, 많은 최적화 문제를 빠르고 간단하게 해결할 수 있다. 단, 항상 최적해를 보장하는 것은 아니므로, 그리디 선택 속성과 최적 부분 구조 조건이 성립하는지 확인하는 것이 중요하다. 알고리즘 문제풀이에서 그리디는 빠르게 풀 수 있는 문제들을 효율적으로 해결하는 강력한 전략이다.
728x90
반응형
'Topic' 카테고리의 다른 글
동적 계획법(Dynamic Programming, DP) (0) | 2025.03.29 |
---|---|
백트래킹(Backtracking) 알고리즘 (0) | 2025.03.29 |
분할 정복(Divide and Conquer) (0) | 2025.03.29 |
트리 탐색(Tree Traversal) 알고리즘 (0) | 2025.03.29 |
해시 탐색(Hash Search) 알고리즘 (0) | 2025.03.29 |