메모리: 31256 KB, 시간: 44 ms
그리디 알고리즘(greedy)
준규가 가지고 있는 동전은 총 N종류이고, 각각의 동전을 매우 많이 가지고 있다.
동전을 적절히 사용해서 그 가치의 합을 K로 만들려고 한다. 이때 필요한 동전 개수의 최솟값을 구하는 프로그램을 작성하시오.
첫째 줄에 N과 K가 주어진다. (1 ≤ N ≤ 10, 1 ≤ K ≤ 100,000,000)
둘째 줄부터 N개의 줄에 동전의 가치 Ai가 오름차순으로 주어진다. (1 ≤ Ai ≤ 1,000,000, A1 = 1, i ≥ 2인 경우에 Ai는 Ai-1의 배수)
첫째 줄에 K원을 만드는데 필요한 동전 개수의 최솟값을 출력한다.
단위가 배수다? 그럼 먼저 그리디를 생각하자.
동전 단위들이 배수이고, 동전 최솟값을 찾는 비교적 간단한 문제이기에 그리디를 먼저 생각하였다. 오름차순으로 데이터가 입력되기에 큐를 임포트해서 popleft로 값을 추가하면 굳이 정렬을 안 해도 될 거 같긴 한데 그렇게는 안 해봤다.
우선 역순으로 정렬을 하고, 단위 리스트인 data를 돌면서 현재 단위(money)가 k보다 작거나 같으면 해당 단위만큼 뺄 수 있으니까 k를 money로 나눈 만큼의 값을 result에 더하고, k를 나머지 값으로 갱신하였다.
import sys
n, k = map(int, sys.stdin.readline().rstrip().split())
data = []
for i in range(n):
data.append(int(sys.stdin.readline().rstrip()))
# 큰 단위부터 계산해야 하므로 역으로 정렬
data.sort(reverse=True)
result = 0
for money in data:
if k >= money: # 남은 값이 현재 돈 단위(money)보다 크면
result += k // money # 몫만큼 동전 개수 추가
k %= money # 남은 값 갱신
print(result)