본문 바로가기

프로그래밍/백준

백준 11047 동전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원을 만드는데 필요한 동전 개수의 최솟값을 출력한다.

 

풀이.

탐욕법은 모든 상황에서 최선의 선택이 아닌 상황에 따라 최적의 방법을 선택한다. 반면에 DP는 모든 방법을 계산을하여 최적의 선택을 한다. 대신 DP는 모든 상황을 계산을 해야하고 탐욕법은 최적의 선택만을 하기에 매우 좋은 성능을 가진다.

우선 입력받을때 K보다 큰 동전들은 리스트에 추가하지 않았다.

그리고 나서 가장 큰 동전부터 각각 먼저 갯수를 세려서 풀었다.

 

소스코드.

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

price = []
for i in range(N):
    p = int(input())
    # K보다 가치가 크다면 넘어가기
    if p > K:
        continue
    else:
        price.append(p)

cnt = 0
while 1:
    cnt += K//price[-1]
    K -= (K//price[-1]) * price[-1]
    if K == 0:
        print(cnt)
        break
    else:
        price.pop()

'프로그래밍 > 백준' 카테고리의 다른 글

백준 11399 ATM - 파이썬  (0) 2021.07.08
백준 1931 회의실 배정 - 파이썬  (0) 2021.07.08
백준 5430 AC - 파이썬  (0) 2021.07.08
백준 1966 프린터 큐 - 파이썬  (0) 2021.07.07
백준 1874 스택수열 - 파이썬  (0) 2021.07.07