Skip to content

문제 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원 추적

단위사용 개수남은 금액
50000017630
1000017630
500012630
10002630
5001130
100130
50030
1030
1+1+2+1+1+0+3=9 개

왜 탐욕법이 최적인가

이 화폐 체계는 각 큰 단위가 그보다 작은 단위들의 배수 관계로 잘 짜여 있어(canonical coin system), "가장 큰 단위부터 최대한 쓰는" 탐욕적 선택이 항상 전체 최소 개수를 준다. (임의의 화폐 체계에서는 탐욕법이 최적이 아닐 수 있어 동적 계획법이 필요하지만, 위 단위 집합에서는 탐욕법으로 충분하다.)

시간복잡도

화폐 단위의 종류 수를 k 라 하면, 반복문이 정확히 k번 돌고 각 단계는 나눗셈·나머지 상수 연산이다. 입력 금액의 크기와 무관하다.

시간복잡도=O(k)  (화폐 단위가 8종 고정이면 O(1))

👉 실습(C++)에서 확인하기

PDF