파이썬 동전 0(BOJ 11047)
2022, Sep 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
예제 출력 2
12
📝 풀어보기
📌 N 종류의 동전을 사용해서 K값을 맞추려고 한다.
각 코인들을 담을 coin_lst를 생성한다. N만큼 반복하면서 coin_lst에 값을 담는다.
N, K = map(int, input().split()) # 10 4200
coin_lst = []
for i in range(N):
coin_lst.append(int(input()))
📌 cnt 를 생성하고 N의 역순으로 순회하면서 카운트에 K를 coin_lst의 요소로 나눈 몫을 누적한다. 그리고 K는 K를 coin_lst의 요소를 나눈 나머지로 갱신한다.
이렇게 하면 cnt에는 나눠진 횟수가 누적될것이고 K에는 나눠지고 난 후의 나머지 잔액으로 갱신될것이다. N을 역으로 순회하면서 K가 0이 된다면 더이상 누적되는 값이 없을것이고 그때에 누적되는 개수가 최소값이 될것이다.
cnt = 0
for i in reversed(range(N)): # 역순으로
cnt += K//coin_lst[i] #카운트 값에 K를 동전으로 나눈 몫을 더해줌
# 4200//50000 = 0, 4200//10000 = 0, 4200//5000 = 0
# 4200//1000 = 4, 200//500 = 0, 200//100 = 2
K = K%coin_lst[i] # K는 동전으로 나눈 나머지로 계속 반복
# 4200, 4200, 4200, 200, 200, 0
print(cnt)
전체 코드
N, K = map(int, input().split()) # 10 4200
coin_lst = []
for i in range(N):
coin_lst.append(int(input()))
count = 0
for i in reversed(range(N)): # 역순으로
count += K//coin_lst[i] #카운트 값에 K를 동전으로 나눈 몫을 더해줌
# 4200//50000 = 0, 4200//10000 = 0, 4200//5000 = 0
# 4200//1000 = 4, 200//500 = 0, 200//100 = 2
K = K%coin_lst[i] # K는 동전으로 나눈 나머지로 계속 반복
# 4200, 4200, 4200, 200, 200, 0
print(count)