coding test

[파이썬] 11047. 동전 0

잔망루피 2022. 11. 15. 22:49

문제

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