단위들이 앞뒤로 배수 관계일 때는 이렇게 큰 단위부터 최대한 할당하는 방식(Greedy)으로 동전 개수의 최솟값을 구할 수 있다. (문제의 조건 중 '1 ≤ Ai ≤ 1,000,000, A1 = 1, i ≥ 2인 경우에 Ai는 Ai-1의 배수'라는 부분)
import sys
temp = sys.stdin.readline().rstrip().split()
N = int(temp[0])
K = int(temp[1])
coins = []
answer = 0
for i in range(N):
coins.append(int(sys.stdin.readline().rstrip()))
for i in reversed(coins):
if i <= K:
answer += K//i
K -= K//i * i
if K == 0:
break
print(answer)
처음에 동전 종류당 사용할 개수를 구하는 for문 안에 while문을 사용했더니 시간초과가 발생했다.
for i in reversed(coins):
while i <= K:
answer += 1
K -= i
if K == 0:
break
이렇게 하면 답은 맞지만 시간초과가 발생한다. while문을 사용하지 않고 if문과 버림 나눗셈(//)을 사용하여 동전 종류당 사용할 개수를 구했더니 해결되었다.
lst.reverse()
reverse() 함수는 리스트의 순서를 거꾸로 뒤집는다.
l2 = reversed(l1)
reversed() 함수는 인자로 들어간 리스트를 거꾸로 뒤집은 새로운 리스트를 리턴한다.