코딩테스트/백준
[백준] 11047번 : 동전 0 / 그리디(Greedy) 알고리즘 / 파이썬
수학도
2021. 5. 23. 19:12
문제
준규가 가지고 있는 동전은 총 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
정답
N, K = map(int, input().split())
A = []
A = [int(input()) for _ in range(N)]
A.reverse()
coin = 0
for Ai in A :
coin += K // Ai
K %= Ai
K 를 Ai 로 나누는 이유
예) K = 4200, A = [1, 5, 10, 50, 100, 500, 1000, 5000, 10000, 50000]
K // Ai | K % A | coin | |
4200 // 50000 = 0 |
4200 % 50000 = 4200 |
0 | 50000원짜리 동전 0개 필요 |
4200 // 10000 = 0 |
4200 % 10000 = 4200 |
0 | 10000원짜리 동전 0개 필요 |
4200 // 5000 = 0 |
4200 % 5000 = 4200 |
0 | 5000원짜리 동전 0개 필요 |
4200 // 1000 = 4 |
4200 % 1000 = 200 |
4 | 1000원짜리 동전 4개 필요 |
200 // 500 = 0 |
200 % 500 = 200 |
4 | 500원짜리 동전 0개 필요 |
200 // 100 = 2 | 200 % 500 = 0 | 6 | 100원짜리 동전 2개 필요 |
0 // 50 = 0 | 0 % 0 = 0 | 6 | 50원짜리 동전 0개 필요 |
0 // 10 = 0 | 0 % 0 = 0 | 6 | 10원짜리 동전 0개 필요 |
… | … | … | … |
오답노트
k 를 0이 될 때까지 줄여나간다 ★
빼기(-) 로 처리 >> 답은 맞지만 시간 초과 (Ai의 최대 입력범위가 크기 때문에 1억이 빼기로 0이 되려면 아주 오래 걸림 )
나머지 연산(%) 으로 처리를 하면 시간 초과 문제 해결 가능 (나누기로 처리를 하면 굉장히 빨라짐 )
파이썬 1초에 약 2천만번 연산 !