탐욕법 (Greedy Algorithm) 은 최적해를 구하는 상황에서 사용하는 방법이다. 여러 경우 중 하나를 선택하고 싶은 경우, 각 상황마다 그 상황에서 가장 좋다고 생각하는 것을 선택해 나가는 방식으로 진행하여 답을 구하는 알고리즘이다. 그러나 그 상황에서 가장 좋다고 생각하는 것이 무조건적으로 가장 좋은 결과를 얻는 것은 당연히 아니다. 예를 들어
위와 같은 상황에서 0에서 시작했을 때 탐욕법을 사용하면 첫 번째 선택에서 가장 큰 결과값인 10의 경로를 택할 것이고, 그 다음 선택에서 가장 큰 결과값인 40의 경로를 택하여 총 50의 보상을 받게되지만, 실제 가장 큰 보상을 받을 수 있는 경로는 5를 선택한 후 100을 선택하는 경로이다 (최적의 해).
그러나 탐욕법은 최적의 해와 근접한 답을 주거나, 어떤 경우에는 탐욕법의 결과가 곧 정답인 문제들이 있다. 가장 유명한 예인 동전 지불에 대해 알아보자.
거스름돈을 돌려줘야 할 때, 가장 적은 수의 동전을 주는 방법을 탐욕법으로 알아내 보자.
내 정답
coins = [500, 100, 50, 10]
def greedy_coins(money):
result = []
count = 0
for coin in coins:
num_coin = money // coin
count += num_coin
result.append(num_coin)
money = money % coin
return result, count
m = 5380
r, c = greedy_coins(m)
print(r, c)
결과
PS C:\Users\bumsu\Desktop\Python\DSA> & C:/Python38/python3.exe "c:/Users/bumsu/Desktop/Python/DSA/Algorithm/11. 동적 계획법/greedy_coins.py"
[10, 3, 1, 3] 17
첫 번째 반환값은 각 동전의 개수, 두 번째 반환값은 총 동전 개수이다.
출처
'Python > 알고리즘 (Algorithm)' 카테고리의 다른 글
11. 동적 계획법 (Dynamic Programming): 파이썬 자료구조와 알고리즘 (0) | 2020.08.09 |
---|---|
10-2. 검색 연습문제 (Searching Examples): 파이썬 자료구조와 알고리즘 (0) | 2020.08.09 |
10-1. 검색 (Searching): 파이썬 자료구조와 알고리즘 (0) | 2020.08.09 |
9-2. 로그 선형 정렬, 고급정렬 (Log-linear Sorting, Advanced Sorting) (0) | 2020.08.07 |
9-1. 2차 정렬과 선형 정렬 (Quadratic and Linear Sorting) : 파이썬 자료구조와 알고리즘 (0) | 2020.08.06 |