Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 백트래킹
- 다익스트라
- 그래프 이론
- 투포인터
- 구현
- 그래프 탐색
- 해시
- 그리디
- 수학
- 브루트포스
- 분할정복
- 다이나믹 프로그래밍
- 누적합
- 서브쿼리
- MST
- join
- 시뮬레이션
- DP
- GROUP BY
- 재귀
- 트리
- 자료구조
- 플로이드-워셜
- DFS
- 다이나믹프로그래밍
- 크루스칼
- BFS
- 우선순위큐
- 다시
- 에라토스테네스의 체
Archives
- Today
- Total
기록하고 까먹지 말기
DP 응용문제(이코테) - 2 본문
날짜 : 2022. .
사용 언어 : python
문제
코드
import sys
n, m = map(int, sys.stdin.readline().split()) # 화폐의 종류 개수, 총 금액
coin = []
dp = [10001] * (m + 1) # 10001 : 임의의 값(무한대)
dp[0] = 0
for i in range(n): coin.append(int(sys.stdin.readline())) # 화폐가치 입력
for i in coin: dp[i] = 1 # 코인 하나로 만들 수 있는 수
for i in range(n): # 화폐 종류 개수별로 for문
for j in range(coin[i], m + 1): # 해당 코인 기준으로 for문 돌림
if dp[j - coin[i]] != 10001: dp[j] = min(dp[j], dp[j - coin[i]] + 1) # (i - k)원을 만드는 방법이 존재하는 경우
if dp[m] == 10001: print(-1)
else: print(dp[m])
풀이
- 화폐 종류의 개수와 달성해야 할 총 금액을 입력받는다.
- 이후 금액에 따른 사용된 화폐 개수를 저장할 리스트(dp)를 생성한 후 무한대로 대표되는 임의의 값(10001)을 설정한다.
- 0의 경우 아무화폐도 사용하지 않았기 때문에 0으로 설정
- 화폐가치와 1개로 만들 수 있는 경우를 입력
- 저장된 화폐의 종류별로 for문을 돌린다.
- 해당 for문 내부에 i값(해당되는 화폐)을 기준으로 for문을 돌리고 해당되는 값을 만드는데 사용된 코인 개수를 최소값으로 최신화한다.(만들 수 있는 값이 있는 경우)
ex) 2 : 2로 만들 수 있는 값에 대해서 오름차순으로 전개해 나가면서 저장 -> 2, 4, 6, 8, 10 ...
-> 4 : 4로 만들 수 있는 값에 대해서 전개하면서 저장 -> 4, 8, 10, 12, .... => 4의 배수의 경우 최솟값으로 갱신
- 이후에 해당되는 값이 존재하는 경우 그 값을 출력하되 없는 경우에는 -1을 출력한다.
알게된 점
- 이중 for문에서 for j in range(coin[i], m + 1) 을 연상해내지 못했다.
- 조금 방식이 복잡해지니까 바로바로 떠올리지 못한 것 같다.
참고 사이트
-
'전공 > 백준' 카테고리의 다른 글
4963 (0) | 2022.11.16 |
---|---|
DP 응용문제(이코테) - 3 (0) | 2022.11.15 |
DP 응용문제(이코테) - 1 (0) | 2022.11.15 |
2579 (0) | 2022.11.13 |
2470 (0) | 2022.11.12 |