일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- English
- 미드시청
- 읽기
- 사이드
- 괜찮음
- 10분
- 쓰릴오브파이트
- 파비최
- 운동
- 만화도
- 화상영어
- Daily Challenge
- 30분
- 스탭퍼
- 리얼 클래스
- realclass
- 월간
- Writing
- FIT XR
- 잡생각
- 뭐든
- 매일
- Problem Solving
- 링피트
- 프로젝트
- 3줄정리
- 영어공부
- 개발자
- 영어원서읽기
- leetcode
Archives
- Today
- Total
파비의 매일매일 공부기록
5.7 거스름돈 최적화 - DP 본문
이번에는 DP를 이용해서 동전 문제를 풀어본다.
이상하게 다른 절들에 비해 알고리즘에 대한 상세한 소개가 별로 안되어있다.
초반에 탐욕 알고리즘을 설명해놔서 그런가;;
재귀 호출을 사용할 때와 비슷한 방법으로 DP로 풀 수 있으나
다만 적은 액수부터 큰 액수를 구하는 방향으로 진행하는 게 차이가 있다.
작성한 소스는 다음과 같다.
def minCoins_dp(coin, n, s):
ar = [MAX_INT for _ in range(s+1)]
ar[0] = 0
for i in range(1, s+1):
for j in range(n):
if coin[j] <= i:
temp = ar[i - coin[j]]
if temp != MAX_INT and temp + 1 < ar[i]:
ar[i] = temp + 1
return ar[s]
coin = list(map(int, input().split()))
s = int(input())
n = len(coin)
print(minCoins_dp(coin, n, s))
여기서 핵심은
i가 정해진 금액인 s에 도달할 때까지 순회하면서
j가 0부터 코인의 종류를 순회하면서 채워나가되
ar에서 금액의 값(i)에서 동전을 뺀(coin [j]) 값에 +1 한 값이 ar [i] 보다 작으면 업데이트를 해주는 부분이다.
i가 1원부터 s까지 도달하는 로직을 생각해내는 게 쉽지 않을 듯..
나중에(한달 정도 후) 다시 풀어보라고 하면 풀수 있을까? 싶은 ㅋㅋㅋㅋㅋㅋ
반응형
'Study > Algorithm 문제풀이' 카테고리의 다른 글
5.8 철근 자르기 - 메모전략 (0) | 2021.09.19 |
---|---|
5.8 철근 자르기 - 재귀 (0) | 2021.09.18 |
5.7 거스름돈 최적화 - 재귀 (0) | 2021.09.16 |
5.6 최장 공통 부분 수열 출력하기 (0) | 2021.09.15 |
5.5 최장 공통 부분 수열 길이 구하기 - DP (0) | 2021.09.14 |
Comments