🎃 탐욕 알고리즘 (Greedy Algorithm) 이란?
- Greedy는 '탐욕스러운, 욕심 많은' 이란 뜻
- 선택의 순간마다 당장 눈 앞에 보이는 최적의 상황만을 쫓아 최종적인 해답에 도달
- 최적해를 구하는 근사적인 방법
- 최종적인 해답(전역적)이 최적이라는 보장은 없음
- 하지만, 탐욕 알고리즘을 적용할 수 있는 문제는 지역적으로 최적이면서 전역적으로 최적
- 100% 최적해를 보장해주지는 않지만 어느 정도 적합한 수준의 해답을 알려줌
- 계산속도가 정확한 알고리즘에 비해 빠른 경우가 많기 때문에, 실용적으로 사용이 가능함
- 그러나, 적당히 괜찮은지에 대한 증명이 수반 될 수 있음
💡 문제 해결 방법
- 선택 절차 : 현재 상태에서의 최적의 해답을 선택
- 적절성 검사 : 선택된 해가 문제의 조건을 만족하는지 검사
- 해답 검사 : 원래의 문제가 해결되었는지 검사 후 해결되지 않았다면 1번으로 돌아가서 과정 반복
✌🏻 탐욕 알고리즘을 적용하기 위한 2가지 조건
- 탐욕적 선택 속성 : 앞의 선택이 이후의 선택에 영향을 주지 않음
- 최적 부분 구조 : 문제에 대한 최종 해결 방법은 부분 문제에 대한 최적 문제 해결 방법으로 구성
🎈 예시
문제
타로는 자주 JOI잡화점에서 물건을 산다. JOI잡화점에는 잔돈으로 500엔, 100엔, 50엔, 10엔, 5엔, 1엔이 충분히 있고, 언제나 거스름돈 개수가 가장 적게 잔돈을 준다. 타로가 JOI잡화점에서 물건을 사고 카운터에서 1000엔 지폐를 한장 냈을 때, 받을 잔돈에 포함된 잔돈의 개수를 구하는 프로그램을 작성하시오.
탐욕 알고리즘으로 문제를 풀기 위해서는 먼저 눈 앞에 보이는 최적의 해답을 선택해야한다.
이때 최적의 해답은 가장 큰 단위의 돈으로 먼저 거슬러 주는 것이다.
그리고, 더이상 거슬러 주지 못할 때 그 다음 단위의 돈으로 거슬러 주는 방식이다.
n = int(input())
change = [500, 100, 50, 10, 5, 1]
price = 1000 - n
result = 0
for i in change:
result += price // i
price %= i
print(result)
[알고리즘] 탐욕 알고리즘(Greedy Algorithm)