12강 / 20강
탐욕 알고리즘 — 지금 제일 좋아 보이는 걸 고른다
쿠폰 자동 적용은 왜 가끔 손님에게 손해일까
손님 장바구니가 52,000원입니다. 쓸 수 있는 쿠폰이 세 장 있어요.
- A — 10,000원 할인 (3만 원 이상)
- B — 15% 할인, 최대 12,000원 (5만 원 이상)
- C — 5,000원 할인 (제한 없음)
쿠폰은 한 장만 쓸 수 있습니다. 어떤 걸 자동으로 적용해 줘야 할까요?
당연히 가장 많이 깎이는 것이죠. B = 52,000 × 15% = 7,800원… 앗, A가 더 낫네요. 이렇게 지금 이 순간 가장 이득인 것을 고르는 방식을 탐욕 알고리즘(greedy algorithm)이라고 합니다.
쿠폰 한 장이면 탐욕이 항상 정답입니다.
Python
브라우저에서 실행
그런데 탐욕이 지는 순간
쿠폰을 여러 장 쓸 수 있게 정책을 바꿨습니다. 단, 총 할인 한도는 20,000원. 그리고 각 쿠폰에는 사용 조건이 붙어 있어요.
이제 "가장 큰 것부터"가 정답이 아닐 수 있습니다.
가장 큰 것 하나를 잡느라 더 좋은 조합을 놓치는 전형적인 사례.
Python
브라우저에서 실행
🎮 쿠폰 조합기
쿠폰을 직접 만들고 한도를 조절하면서 탐욕과 완전 탐색의 결과를 나란히 비교해 보세요. 탐욕이 지는 경우를 만들어 보는 것이 이번 실습의 목표입니다. 계산 횟수도 함께 표시되니, 완전 탐색의 비용도 확인하세요.
실무에서의 현실적인 타협
실제 쇼핑몰은 이렇게 합니다.
| 상황 | 선택 | 이유 |
|---|---|---|
| 쿠폰 1장만 사용 가능 | 탐욕 | 탐욕이 곧 최적. 계산 즉시. |
| 쿠폰 여러 장, 개수 적음(≤15) | 완전 탐색 또는 DP | 정확한 최적을 보장 |
| 쿠폰 종류가 아주 많음 | 탐욕 + 정책 제한 | "중복 사용 최대 2장" 같은 규칙으로 n을 줄임 |
| 배송 박스 포장 | 탐욕(큰 것부터) | 최적은 어렵지만 실용적으로 충분 |
"정책을 단순하게 만들어 알고리즘 문제를 없앤다"는 것도 시스템 관리자의 훌륭한 해결책입니다.
탐욕의 성공 여부는 '문제의 구조'에 달려 있습니다.
Python
브라우저에서 실행
🤔 확인 문제
탐욕 알고리즘의 정의로 가장 알맞은 것은?
해설 지금의 최선을 고릅니다. 빠르지만 전체 최적을 보장하지 않아요. 1번은 완전 탐색, 4번은 13강의 동적 계획법입니다.
🤔 확인 문제
쿠폰 25장 중 조합을 완전 탐색하면 몇 가지 경우를 봐야 할까요?
해설 2²⁵ ≈ 3,355만 가지입니다. 30장이면 10억이 넘어요. 이것이 O(2ⁿ) 지수 시간의 무서움입니다.
🤔 확인 문제
화폐 단위가 [1, 3, 4]원일 때 6원을 거슬러 주려 합니다. 탐욕(큰 것부터)의 결과는?
해설 탐욕은 4+1+1 = 3개, 최적은 3+3 = 2개입니다. 탐욕은 문제의 구조가 받쳐 줄 때만 최적이에요.