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 |
Tags
- Level1
- 다이나믹프로그래밍
- python3
- 그리디
- 부스트캠프_AITech_3기
- 백트랙킹
- 백준
- 파이썬 3
- 기술면접
- 개인회고
- ODQA
- 그래프이론
- Level2
- 알고리즘스터디
- dfs
- U_stage
- 다시보기
- 구현
- 알고리즘_스터디
- mrc
- 정렬
- 부스트캠프_AITech3기
- 주간회고
- 단계별문제풀이
- dp
- 최단경로
- 이코테
- Level2_PStage
- 이진탐색
- 프로그래머스
Archives
- Today
- Total
국문과 유목민
[DP] 효율적인 화폐구성 본문
1. 문제 설명
몇 개의 화폐와 TargetNumber 주어진다. 해당 화폐를 가지고 주어진 수를 만들기 위한 최소한의 경우를 구하라.
- df에 만들 수 있는 최소의 경우의 수를 찾는다. 덧셈으로 값이 구성이 된다.따라서 들어오는 array마다 조건이 달라질 것이다.
- 값이 증가하지 않는다면 -1을 넣어야 하지만 최소의 경우의 수를 구해야 하기 때문에 큰 금액을 넣어준다.
2. 코드
# 입력
n, m = list(map(int, input().split()))
array = []
for i in range(n):
array.append(int(input()))
money = list(set(array))
"""
2 15
2
3
"""
# DP
df = [10001]*(m+1)
df[0] = 0
# 값을 찾을 때까지 for문을 돈다.
for token in money:
for i in range(token, m+1):
if df[i-token] !=10001:
df[i] = min(df[i], df[i-token]+1)
if df[m] ==10001:
print(-1)
else:
print(df[m])
# >> 5
3. 코멘트
- DP 문제의 경우 코드는 간결하지만, 알고리즘을 구현하기 위한 점화식을 생각하기까지 시간이 걸리는 것 같다.
- 특히, 이번 문제의 경우 `i-token`을 하는 과정에서 꽤나 시간을 썼던 것 같다.
'알고리즘_코딩테스트 > 이것이 코딩테스트다' 카테고리의 다른 글
[최단경로] 전보 (0) | 2021.12.07 |
---|---|
[최단경로] 미래도시 (0) | 2021.12.07 |
[DP] 바닥공사 (0) | 2021.12.07 |
[DP] 개미전사 (0) | 2021.12.07 |
[DP] 1로 만들기 (0) | 2021.12.07 |
Comments