[백준][Python][Greedy] 동전0

📃 문제

준규가 가지고 있는 동전은 총 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원을 만드는데 필요한 동전 개수의 최솟값을 출력한다.

💻 문제 풀이

""" Code1 """
# time : 20

n, k = map(int, input().split())
coin_types = []
for i in range(n):
    coin_types.append(int(input()))

result = 0
coin_types.sort(reverse=True)      
for i in range(n):
    result += k // coin_types[i]
    k %= coin_types[i]

print(result)
""" Code2 """
# time : 7

n, k = map(int, input().split())
coin_types = []
for i in range(n):
    coin_types.append(int(input()))

result = 0
for i in range(n):
    coin = coin_types.pop()         
    result += k // coin
    k %= coin

print(result)
""" Code3 """
# time : 1

n, k = map(int, input().split())
coin_types = []
for i in range(n):
    coin_types.append(int(input()))

result = 0
coin_types.reverse()               
for i in range(n):
    result += k // coin_types[i]
    k %= coin_types[i]

print(result)

중요 포인트

  1. 두 번째 입력 받은 값들(동전의 종류)에서 마지막 값들(=큰 값들)부터 가져온다.
  2. '동전 개수의 최솟값'을 구하고 싶은 것이기 때문에 큰 값들부터 가져와 계산한다.

시간 비교를 해봤을 때 Code3이 제일 빠르다.

  • Code1sort()를 하기 때문에 시간이 제일 오래 걸리는 것 같다.
  • Code2list.pop()을 하게 되면 리스트의 가장 마지막 값이 나온다. 뒤집지 않고 마지막 값을 뽑아내서 구하는 방법이다.
  • Code3list.reverse()를 사용해 단순히 배열을 뒤집는 것이다.
    동전의 종류를 오름차순으로 입력 받지 않았다면 sort(reverse=True)를 사용해야 했을 텐데 문제에서 오름차순으로 입력 받기 때문에 sort()를 하지 않고 단순히 reverse()만 해줘도 된다.

좋은 웹페이지 즐겨찾기