[Python] 백준 11047: 동전 0

https://www.acmicpc.net/problem/11047

 

11047번: 동전 0

첫째 줄에 N과 K가 주어진다. (1 ≤ N ≤ 10, 1 ≤ K ≤ 100,000,000) 둘째 줄부터 N개의 줄에 동전의 가치 Ai가 오름차순으로 주어진다. (1 ≤ Ai ≤ 1,000,000, A1 = 1, i ≥ 2인 경우에 Ai는 Ai-1의 배수)

www.acmicpc.net

1차 시도

더보기
n, k = map(int, input().split())
lis = []
for i in range(n):
    money = int(input())
    lis.append(money)
#입력으로 받은 n개의 돈 단위를 money list에 저장

money_ans = []
s_lis = sorted(lis, reverse=True)

#내림차순으로 정렬(잔돈 최소화 위해)
for j in s_lis:
    cnt = 0
    while k - j >= 0:
        cnt += 1
        k -= j
    money_ans.append(cnt)
#잔돈 계산
print(sum(money_ans))

시간 초과가 나왔다. 아마도 while 문을 줄여야 할 거 같은데...

 

ANS

 

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

money_ans = []
s_lis = sorted(lis, reverse=True)

for j in s_lis:
    cnt = 0
    while k // j > 0:
        cnt = (k//j)
        k = k % j
    money_ans.append(cnt)
#빼기로 길어지는 while문 나누기로 한 번에 줄였다. 몫만큼 돈 단위 수를 세고 나머지를 계속 for문에 돌려주면 된다.
print(sum(money_ans))

전형적인 그리디 알고리즘.

TAGS.

Comments