백준 12865번 python 풀이 - 동전 0
문제 링크
해결책
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import sys
INF = 999999999
N, K = map(int, sys.stdin.readline().split())
coins = []
for _ in range(N):
temp = int(sys.stdin.readline())
if temp < K:
coins.append(temp)
elif temp == K:
print(1)
exit()
"""
DP를 활용한 풀이. 조금 당연하게도, Memory 초과가 발생한다.
dp = [INF for i in range(K + 1)]
dp[0] = 0
for coin in coins:
for idx in range(coin, K+1):
dp[idx] = min(dp[idx], dp[idx-coin] + 1)
print(dp[-1])
"""
# 그리디 알고리즘을 활용한 풀이
# 먼저, coins는 모두 첫번째 coin의 배수이므로, 결과도 coin들도 싹 a1으로 나눠버릴까?
# 굳이 의미가 있나? 큰 수의 계산을 작은 수의 계산으로 바꾸는게 효율적인가?
# divider = coins[0]
# if divider != 1:
# for i in range(0, len(coins)):
# coins[i] //= divider
#
# K //= divider
# 여기서 DP를 쓸수도 있지 않을까?
# 근데 최소가 1이면 그대로겠네.
# 그리디 아이디어
# 먼저, 제일 큰 동전을 사용해서 값을 구한다.
# 그 나머지를 아래의 동전들로 구하려고 해본다.
# 동전의 처음까지 내려왔다면, 위의 동전의 갯수를 줄여본다.
cur_idx = len(coins) - 1
_sum = 0
remain = K
cur_val = coins[-1]
while remain != 0:
if cur_val <= remain:
cur_num = remain // cur_val
remain = remain - cur_num * cur_val
_sum += cur_num
cur_idx -= 1
if cur_idx < 0:
break
cur_val = coins[cur_idx]
if remain == 0:
print(_sum)
exit()
주석으로 달 설명
그리디 쉬운 문제. dp적인 접근도 생각나서, 시도해 보았지만 조금 당연할지도 모르지만 시간초과가 났다.
This post is licensed under CC BY 4.0 by the author.