문제
준규가 가지고 있는 동전은 총 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원을 만드는데 필요한 동전 개수의 최솟값을 출력한다.
예제 입력 1
10 4200
1
5
10
50
100
500
1000
5000
10000
50000
예제 출력 1
6
예제 입력 2
10 4790
1
5
10
50
100
500
1000
5000
10000
50000
예제 출력 2
12
이 문제는 그리디 알고리즘을 활용하여 해결하는 문제였습니다. 맞춰야 하는 값은 K값이며 N개의 수들 중에 최소한으로 사용한 경우의 사용한 수의 갯수를 출력하는 문제였습니다. 최소한의 갯수를 사용하려면 가능한 큰 수를 활용해서 K값을 맞춰줘야 합니다. 가장 큰 수부터 순회를 하면서 빼줄 수 있는 한 최대로 빼주고 남은 K값을 가지고서 그 다음번 숫자에서 최대한 빼줄 수있는 한도까지 빼주는 형태로 연산이 됩니다. K가 0이 되는 지점이 오면 연산을 마치고 출력시킵니다.
만약 주어지는 N개의 수들이 뒤죽박죽이고 정렬을 시키지 않은 상태로 문제를 해결 해야했다면 최적의 답이 되지 않았겠지만 정렬을 시켜서 해결하여 최적의 답이 되었습니다.
import sys
N, K = map(int,input().split())
arr = []
for _ in range(N):
arr.append(int(sys.stdin.readline().strip()))
arr.reverse()
cnt = 0
pos = 0
while K > 0:
if K < arr[pos]:
pass
else:
M = K // arr[pos]
P = arr[pos] * M
# print(f'{M}개가 {arr[pos]}에서 나옵니다. ')
cnt += M
K -= P
pos += 1
print(cnt)
'알고리즘 > 문제풀이' 카테고리의 다른 글
백준 9095번 1,2,3 더하기 - Python (0) | 2023.03.19 |
---|---|
백준 11399 ATM - Python (0) | 2023.03.19 |
백준 1676번 팩토리얼 0의 개수 : Python (1) | 2023.03.15 |
백준 1620번 나는야 포켓몬 마스터 이다솜 - Python (0) | 2023.03.14 |
백준 1541번 잃어버린 괄호 - Python (0) | 2023.03.13 |