일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 링피트
- 10분
- leetcode
- 스탭퍼
- 30분
- Problem Solving
- English
- 영어공부
- Writing
- 화상영어
- 운동
- 뭐든
- 만화도
- 영어원서읽기
- 파비최
- Daily Challenge
- 3줄정리
- FIT XR
- 미드시청
- 괜찮음
- 사이드
- 잡생각
- realclass
- 읽기
- 월간
- 쓰릴오브파이트
- 리얼 클래스
- 개발자
- 프로젝트
- 매일
Archives
- Today
- Total
파비의 매일매일 공부기록
5.7 거스름돈 최적화 - 재귀 본문
오늘은 탐욕 알고리즘으로 잘 알려진 동전 문제 중에 하나를 풀어본다.
액면가가 다른 여러 종류의 동전을 제한 없이 사용 가능할 때
어떤 금액을 지불하는 데 사용 가능한 동전 개수의 최솟값을 구하는 문제다.
탐욕 알고리즘을 사용한다면, 가장 큰 액면가의 동전을 먼 자 사용해서 금액을 채워나가면 된다.
그러나 특정 조건(10원, 50원, 100원, 500원 등 가능한 조합)이 아니라면 탐욕 알고리즘을 사용했을 때,
최적의 값을 찾아낼 수 없다.
그렇기에 재귀 호출을 사용해서 풀어본다.
minCoins(S) = 1 + MIN(minCoins(S - coin [0]), minCoins(S - coin [1]),... minCoins(S - coin [N-1]))
위의 식이 점화식이라는데.. 좀 이해가 안 된다 ㅠㅠ 이걸 어찌 구현하라는 거지.
그리고 종료 조건은 S가 0인 경우다.
책에 나온 소스를 파이썬으로 바꿔서 코딩하면 다음과 같다.
import sys
sys.setrecursionlimit(10**5)
def minCoins(coin, n, s):
if s == 0:
return 0
result = 987654321
for i in range(n):
if coin[i] <= s:
temp = minCoins(coin, n, s - coin[i])
if temp + 1 < result:
result = temp + 1
return result
coin = list(map(int, input().split()))
s = int(input())
n = len(coin)
print(minCoins(coin, n, s))
위에 소스를 실행하면 효율이 매우 똥망이다..
2 5 10 15
60
정도로 사람이 구해도 그냥 4가 나오는 계산을 엄청 오래 한다 ㅋㅋㅋㅋㅋㅋㅋㅋ
반복 계산이 매우 많은 듯 ㅠㅠ
내일은 이걸 DP로 바꿔보는 작업을 할 예정!
반응형
'Study > Algorithm 문제풀이' 카테고리의 다른 글
5.8 철근 자르기 - 재귀 (0) | 2021.09.18 |
---|---|
5.7 거스름돈 최적화 - DP (0) | 2021.09.17 |
5.6 최장 공통 부분 수열 출력하기 (0) | 2021.09.15 |
5.5 최장 공통 부분 수열 길이 구하기 - DP (0) | 2021.09.14 |
5.5 최장 공통 부분 수열 길이 구하기 - 메모전략 (0) | 2021.09.13 |
Comments