파이썬 동전 0(BOJ 11047)


문제

준규가 가지고 있는 동전은 총 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)

관심있을 포스팅