https://www.acmicpc.net/problem/2294
2294번: 동전 2
첫째 줄에 n, k가 주어진다. (1 ≤ n ≤ 100, 1 ≤ k ≤ 10,000) 다음 n개의 줄에는 각각의 동전의 가치가 주어진다. 동전의 가치는 100,000보다 작거나 같은 자연수이다. 가치가 같은 동전이 여러 번 주
www.acmicpc.net
이 문제같은 경우에는
나동빈님이 쓰신
이것이 코딩테스트다에 수록된
DP 대표유형에 속한 문제입니다.
처음에 문제의 풀이를 쭉 따라가도
이게 뭔소리지 하다가
직접 코드를 몇 번 쳐보고서야
이게 이런 의미이구나를 깨달았습니다.
이 문제를 DP로 풀기위해
이렇게 테이블을 쭉 그려봤습니다.
예시의 케이스를 가져와봤습니다.
동전 1이 있으므로
1부터 4까지 하나씩 증가하다가
5부터는 다시 1이 됩니다.
그 이유는 동전 5가 있기 때문이죠.
그렇게 계속 증가하다가
10에서 2가 됩니다.
5 2개를 쓸 수 있기 때문이죠.
그렇게 보면
현재 i번째 dp는
(i-동전의 수+1) 중
가장 최솟값에 해당합니다.
그러니 15에서는
12 1 1 1-->4 대신
5 5 5 -->3이 되는 것이죠.
코드를 보면 이렇게 됩니다.
#백준 2294 동전2
from sys import stdin
n,k=map(int,stdin.readline().split())
coin=[]
for _ in range(n):
c=int(stdin.readline().rstrip())
coin.append(c)
dp=[10001]*(k+1)
dp[0]=0
for num in coin:
for j in range(num,k+1):
dp[j]=min(dp[j],dp[j-num]+1)
if dp[k]==10001:
print(-1)
else:
print(dp[k])
DP문제는
프로그래밍 피지컬보다는
'뇌지컬'이 요구되는 문항이라
체감난이도가 높게 느껴집니다.
그냥 이런 류의 문제를
많이 풀고
코드를 많이 보고
직접 손으로 치면서
손으로 익히는 것 밖에는
왕도가 없어보이네요.
[백준 21609번] 상어중학교(파이썬) (1) | 2022.03.31 |
---|---|
[백준 17822번] 원판돌리기 (0) | 2022.03.29 |
[백준 20056번] 마법사 상어와 파이어볼(파이썬) (0) | 2022.03.27 |
[백준 19237번] 어른상어(파이썬) (0) | 2022.03.27 |
[백준 21608번] 상어 초등학교(파이썬) (0) | 2022.03.26 |
댓글 영역
Tabris4547님의
글이 좋았다면 응원을 보내주세요!
이 글이 도움이 됐다면, 응원 댓글을 써보세요. 블로거에게 지급되는 응원금은 새로운 창작의 큰 힘이 됩니다.
응원 댓글은 만 14세 이상 카카오계정 이용자라면 누구나 편하게 작성, 결제할 수 있습니다.
글 본문, 댓글 목록 등을 통해 응원한 팬과 응원 댓글, 응원금을 강조해 보여줍니다.
응원금은 앱에서는 인앱결제, 웹에서는 카카오페이 및 신용카드로 결제할 수 있습니다.