sm 기술 블로그

146. 11047(동전 0) - 파이썬 본문

문제/백준_파이썬

146. 11047(동전 0) - 파이썬

sm_hope 2022. 7. 17. 09:36
import sys
input = sys.stdin.readline

N,K = map(int,input().split())

coinList = sorted([int(input()) for _ in range(N)], reverse = True)
cnt = 0

for val in coinList:
  if K == 0:
    break
  cnt += K//val
  K %= val

print(cnt)

문제요약

주어진 동전 리스트를 최소로 사용하여 가치에 맞게 만드시오

설명

그리디 알고리즘의 대표 문제이다.

그리디 알고리즘에 대해서는 아래를 참고하자

https://smhope.tistory.com/384

 

[알고리즘 | 자료구조] 그리디 알고리즘(Greedy Algorithm)

그리디 알고리즘(Greedy Algorithm) 선택의 순간마다 당장 눈앞에 보이는 최적의 상황만을 쫒아 최종적인 해답에 도달하는 방법 예시) 다음 중 가장 큰수를 고르라고 한다면 그리디 알고리즘은 12 -> 6

smhope.tistory.com

 

간단히 설명하면 주어진 상황에 가장 최적인 것을 선택해서 문제를 해결하는 것이다.

 

위 문제에서는 동전리스트를 최소로 사용하고자 하므로 동전 가격이 가장 큰 것 부터 고르면 된다.

coinList = sorted([int(input()) for _ in range(N)], reverse = True)

따라서 주어진 동전리스트를 내림차순으로으로 정리하였다.

 

for val in coinList:
  if K == 0:
    break
  cnt += K//val
  K %= val

매번 가장 큰 동전 부터 시작해서 반복하는 방법도 있지만, 그렇게 하면 시간이 매우 오래걸린다.

따라서 한번 선택한 동전을 가치에서 나눠준 몫을 카운터에 저장한다.

 

예를들어 4200의 가치를 맞추고자 할 때 동전리스트 중에서 1000원이 가장 큰 수라면 1000원이 4장 필요하다.

따라서 4200에서 1000을 나눠 나온 몫 4를 카운트에 저장하고, 4200에서 1000을 나눈 나머지 200은 다음으로 넘긴다.

Comments