문제 13 · 화폐 최소 개수 거스름돈
문제 13 [5점]
화폐 단위로 5만원, 1만원, 5천원, 1천원, 500원, 100원, 50원, 10원이 있다고 하자. 임의의 입력 금액에 대해, 화폐의 갯수를 최대한 적게 사용한 결과값을 출력하는 의사알고리즘pseudoalgorithm을 작성(4점)하고, 이 알고리즘의 시간복잡도time complexity를 서술(1점)하시오.
- 입력 예시: 17,630원
- 출력 예시: 9개 (1만원 1개, 5천원 1개, 1천원 2개, 500원 1개, 100원 1개, 10원 3개)
풀이 및 해설
의사알고리즘 (탐욕법)
화폐 단위를 큰 것부터 훑으며, 현재 남은 금액을 그 단위로 최대한 많이 나눈다.
text
MinCoins(amount):
coins ← [50000, 10000, 5000, 1000, 500, 100, 50, 10] // 내림차순
count ← 0
for c in coins:
count ← count + (amount ÷ c) // 이 단위를 몇 장 쓰는지 (정수 나눗셈)
amount ← amount mod c // 남은 금액
return count입력 17,630원 추적
| 단위 | 사용 개수 | 남은 금액 |
|---|---|---|
| 50000 | 0 | 17630 |
| 10000 | 1 | 7630 |
| 5000 | 1 | 2630 |
| 1000 | 2 | 630 |
| 500 | 1 | 130 |
| 100 | 1 | 30 |
| 50 | 0 | 30 |
| 10 | 3 | 0 |
왜 탐욕법이 최적인가
이 화폐 체계는 각 큰 단위가 그보다 작은 단위들의 배수 관계로 잘 짜여 있어(canonical coin system), "가장 큰 단위부터 최대한 쓰는" 탐욕적 선택이 항상 전체 최소 개수를 준다. (임의의 화폐 체계에서는 탐욕법이 최적이 아닐 수 있어 동적 계획법이 필요하지만, 위 단위 집합에서는 탐욕법으로 충분하다.)
시간복잡도
화폐 단위의 종류 수를