메모리: 114328 KB, 시간: 296 ms
그리디 알고리즘
준규가 가지고 있는 동전은 총 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원을 만드는데 필요한 동전 개수의 최솟값을 출력한다.
1번 코드로 했을떄는 python에서 시간초과가 발생했지만, 2번코드는 파이썬으로도 충분히 돌아간다.
import sys
input = sys.stdin.readline
n, k = map(int, input().split())
lst = [int(input()) for _ in range(n)]
lst.sort(reverse=True)
i = 0
cnt = 0
while k:
if k - lst[i] >= 0:
k -=lst[i]
cnt += 1
else:
i += 1
print(cnt)
python으로 제출했을때 시간초과가 발생한다. 저렇게 리스트에 넣어서 빼는 방식으로 해서 그렇다. 그냥 연산을 해서 풀면 python으로 제출해도 문제가 없을것이다.
아래는 수학적인 연산을 이용한 새 코드이다.
import sys
input = sys.stdin.readline
n, k = map(int, input().split())
lst = [int(input()) for _ in range(n)]
lst.sort(reverse=True)
i = 0
cnt = 0
for op in lst:
if k == 0:
break
if k >= op:
m = k // op
k -= (m*op)
cnt += m
print(cnt)
한 번 루프마다 계산할 수 있는 만큼 모두 계산을 해주어 최적화 해주었다.
이렇게 계산해줌으로서 반복문을 도는 수를 획기적으로 줄였고 python으로도 AL이 나왔다.