문제
준규가 가지고 있는 동전은 총 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 = map(int, input().split()) # 동전 종류수, 가치의 합
A = [int(input()) for n in range(N)] # 오름차순 정렬된 동전의 가치 리스트
answer = 0
total = K
for i in range(N-1, -1, -1) : # 뒤에서부터 탐색
if total == 0 :
break
elif total >= A[i] :
cnt = total // A[i] # 사용할 수 있는 동전의 개수
total -= cnt * A[i]
answer += cnt
print(answer) # K원을 만드는데 필요한 동전 개수의 최솟값
뒤에서부터 탐색하면 필요한 동전 개수의 최솟값을 만들 수 있다.
시간 복잡도는 O(N)
🔥 다른 사람 풀이
# https://god-gil.tistory.com/64
N, K = map(int, input().split())
coin_lst = list()
for i in range(N) :
coin_lst.append(int(input()))
count = 0
for i in reversed(range(N)) :
count += K // coin_lst[i] # 카운트 값에 K를 동전으로 나눈 몫을 더해줌
K = K % coin_lst[i] # K는 동전으로 나눈 나머지로 계속 반복
print(count)
이 풀이를 보니까 곱하고 빼는 것 보다 나머지를 이용하는 게 더 낫다.
문제의 입력 조건 'A1 = 1, i ≥ 2인 경우에 Ai는 Ai-1의 배수'를 잘 이용했다.
문제 출처 👉 백준
반응형
'coding test' 카테고리의 다른 글
[파이썬] 16940. BFS 스페셜 저지 (0) | 2022.12.04 |
---|---|
[파이썬] 1167. 트리의 지름 (0) | 2022.11.19 |
[파이썬] 9663. N-Queen (0) | 2022.11.10 |
[파이썬] 13460. 구슬 탈출 2 (0) | 2021.12.08 |
[파이썬, Java] 16926. 배열 돌리기 1 (0) | 2021.11.15 |