
그리디 알고리즘?
매 순간 최선이라고 생각되는 선택을 하여 전체 문제의 최적해를 구하는 알고리즘 전략
탐욕법이라고 부르기도 한다.

특징
- 탐욕적 선택 속성 : 매 순간 가장 최적의 선택을 하는 것이 최종 해답의 최적성을 보장하는 속성
- 최적 부분 구조 : 전체 문제의 최적해가 부분 문제의 최적해들로 구성될 수 있는 구조
장점
- 빠른 시간 복잡도 : 보통 정렬 O(n log n) + 선형 스캔 O(n) 등으로 매우 효율적이다.
- 메모리 적음 : 상태 저장(테이블) 필요성이 적다.(대부분 상수 또는 선형)
- 구현 쉬움 : 코드가 짧고 디버깅이 쉽다.
단점
- 항상 최적이 아니다 : 잘못된 그리디 규칙은 전혀 최적해를 주지 못한다.
- 증명 필요 : 그리디 방법이 최적임을 보이려면 교환 주장(exchange argument) 등으로 증명해야 한다.
- 문제 인식 필요 : 문제의 구조를 잘 파악하지 못하면 그리디를 적용하면 틀린 경우도 있다.
문제 유형
● 활동 선택 문제
| 활동 번호 | 시작 시간 | 종료 시간 |
| A1 | 1 | 2 |
| A2 | 3 | 4 |
| A3 | 0 | 6 |
| A4 | 5 | 7 |
| A5 | 8 | 9 |
activities = [(1,2), (3,4), (0,6), (5,7), (8,9)]
activities.sort(key=lambda x: x[1]) # end time 순 정렬
result = []
current_end = 0
for start, end in activities:
if start >= current_end:
result.append((start, end))
current_end = end
print(result) # [(1,2), (3,4), (5,7), (8,9)]
● 거스름돈 계산
목표: 최소 개수의 동전으로 특정 금액을 만들기
전략: 큰 동전부터 최대한 사용
| 단계 | 사용 동전 | 남은 금액 | 동전 개수 |
| 500원 사용 | 1260 → 1260 // 500 = 2개 | 1260 - 1000 = 260 | 2개 |
| 100원 사용 | 260 → 260 // 100 = 2개 | 260 - 200 = 60 | 4개 |
| 50원 사용 | 60 → 60 // 50 = 1개 | 60 - 50 = 10 | 5개 |
| 10원 사용 | 10 → 10 // 10 = 1개 | 10 - 10 = 0 | ✅ 6개 |
coins = [500, 100, 50, 10]
target = 1260
count = 0
for coin in coins:
count += target // coin # 해당 동전을 최대 몇 개 쓸 수 있는가
target %= coin # 남은 잔돈 갱신
print(count) # 출력: 6
'Etc > study' 카테고리의 다른 글
| [4주차] 다익스트라 알고리즘 (0) | 2025.10.19 |
|---|---|
| [4주차] 유니온 파인드 알고리즘 (0) | 2025.10.17 |
| [4주차] 세그먼트 트리 (0) | 2025.10.16 |
| [3주차] 비선형 자료구조 (0) | 2025.10.06 |
| [2주차] 정렬 알고리즘 (0) | 2025.09.30 |