▶ 문제 설명
당신은 음식점의 계산을 도와주는 점원이다. 카운터에는 거스름돈으로 사용할 500원, 100원, 50원, 10원짜리 동전이 무한히 존재한다고 가정한다. 손님에게 거슬러 줘야 할 돈이 N원일 때 거슬러 줘야 할 동전의 최소 개수를 구하라. 단, 거슬러 줘야 할 돈은 항상 10의 배수이다.
▶ 시간 복잡도
작성한 코드를 보면 화폐의 종류만큼 반복을 수행해야 한다는 것을 알 수 있다. 화폐의 종류가 K개라고 할 때 아래 소스코드의 시간 복잡도는 O(K) 이다. 참고로 시간 복잡도에서 거슬러 주어야 할 돈 N은 찾아볼 수 없는 것을 알 수 있다. 즉, 이 알고리즘의 시간 복잡도는 동전의 총 종류에만 영향을 받고, 거슬러 줘야하는 금액의 크기와는 무관하다는 것을 알 수 있다.
▶ Code
n = 1260
count = 0
# 큰 단위의 화폐부터 차례대로 확인하기
coin_types = [500, 100, 50, 10]
for coin in coin_types:
count += n // coin # 해당 화폐로 거슬러 줄 수 있는 동전의 개수 세기
n %= coin
print(count)
▶ Point
- 최적의 해를 빠르게 구하기 위해서는 가장 큰 화폐 단위부터 돈을 거슬러 주면 된다.
- N원을 거슬러 줘야 할 때, 가장 먼저 500원으로 거슬러 줄 수 있을 만큼 거슬러 준다.
- 이후에 100원, 50원, 10원 짜리 동전을 차례대로 거슬러 줄 수 있을 만큼 거슬러 주면 된다.
- 가장 큰 화폐 단위부터 돈을 거슬러 주는 것이 최적의 해를 보장하는 이유를 생각해 볼 필요가 있다.
- 가지고 있는 동전 중에서 큰 단위가 항상 작은 단위의 배수이므로 작은 단위의 동전들을 종합해 다른 해가 나올 수 없기 때문이다.
- Greedy Algorithm 문제에서는 이처럼 문제 풀이를 위한 최소한의 아이디어를 떠올리고 이것이 정당한지 검토할 수 있어야 한다.
'Developer > Algorithm' 카테고리의 다른 글
[Algorithm] (이코테) Implementation - 시각 (Python/파이썬) (0) | 2023.03.10 |
---|---|
[Algorithm] (이코테) Implementation - 상하좌우 (Python/파이썬) (0) | 2023.03.10 |
[Algorithm] (이코테) Greedy - 모험가 길드 (Python/파이썬) (0) | 2023.03.05 |
[Algorithm] (이코테) Greedy - 곱하기 혹은 더하기 (Python/파이썬) (0) | 2023.03.05 |
[Algorithm] (이코테) Greedy - 1이 될 때까지 (Python/파이썬) (0) | 2023.03.05 |
댓글