대딩 기록(~22.01)/알고리즘 공부노트
알고리즘 - 그리디(greedy)
문과 해달
2021. 6. 24. 23:24
*참고저서 - 나동빈 <이것이 취업을 위한 코딩 테스트다>
그리디는 한국어로 바꾸면 말 그대로 '탐욕스러운'이라는 뜻이다.
이름과 같이 이후 상황을 고려하지 않고 현재 상황에서 가장 좋은 것만 고르는 방법이다.
그리디의 경우 dfs/bfs/mst 문제들처럼 코드의 원형이 따로 없으며 아이디어의 형태로 존재한다.
해당 문제가 그리디로 해결 가능한지 판별하고 정답을 제공하는 접근법을 떠올리기까지가
그리디 문제의 핵심이라 할 수 있다.
여기서 보통 '~~한 순서로' 와 같은 접근법이 나오기에, 정렬에 대한 이해도 조금은 필요하다.
그리디 문제를 설명하는 대표 예제는 거스름돈 문제이다.
거슬러 줘야 할 돈 N원이 주어졌을 때, 500,100,50,10원 짜리 동전들을 이용해 거슬러 준다 하자.
이 때 동전의 최소 개수를 구하라.
가장 쉬운 예제답게 접근법 역시 간단하게 생각할 수 있다. 가장 큰 화폐부터 돈을 거슬러 주는 것이다.
500원 짜리를 최대한 사용한 경우의 동전 개수가 500원짜리를 덜 사용한 동전 개수보다 클 리가 없으니
이 접근방법은 항상 정답을 제공한다.
예제 코드는 다음과 같다.
n = int(input())
count = 0
coins = [500,100,50,10,]
for coin in coins:
count += n // coin
n %= coin
print(count)
그리디 알고리즘의 형태에 대한 대략적인 틀은 다음과 같이 일반화할 수 있다
