일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 서평
- 독후감
- 프로그래밍언어
- C
- algorithmTest
- 다독
- 채권
- 화장품
- 알고리즘트레이닝
- 프로그래머스 알고리즘 공부
- 알고리즘 공부
- 재테크
- 주식
- 책알남
- C++
- 성분
- 책을알려주는남자
- algorithmStudy
- 돈
- 자바
- 자바스크립트
- 백준알고리즘
- 투자
- 알고리즘공부
- JavaScript
- algorithmtraining
- 지혜를가진흑곰
- 경제
- Java
- 독서
- Today
- Total
탁월함은 어떻게 나오는가?
[Algorithm] 동전 교환 문제(Coin Change Problem)로 공부하는 동적 프로그래밍(Dynamic Programming) 본문
[Algorithm] 동전 교환 문제(Coin Change Problem)로 공부하는 동적 프로그래밍(Dynamic Programming)
Snow-ball 2024. 12. 29. 23:21Dynamic Programming(DP)의 장점은 중복되는 부분 문제(Overlapping Subproblems)와 최적 부분 구조(Optimal Substructure)를 가지는 문제를 효율적으로 해결할 수 있다.
오늘은 동전 교환 문제에 대해 풀어보고 설명해보자.
동전 교환 문제는 DP의 대표적인 최적화 문제이다. 주어진 금액을 특정 동전 단위로 만들기 위해 필요한 최소 동전의 개수를 구하는 것이 목표이다.
풀이를 먼저 확인해보자.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
def coin_change(coins, amount):
dp = [float('inf')] * (amount + 1)
dp[0] = 0
for i in range(1, amount + 1):
for coin in coins:
if i - coin >= 0:
dp[i] = min(dp[i], dp[i - coin] + 1)
return dp[amount] if dp[amount] != float('inf') else -1
coins = [1, 2, 5]
amount = 11
print(coin_change(coins, amount)) # Output: 3
|
cs |
나는 액면가가 11이 되는데, 최소한의 동전 개수를 찾는게 목표이다.
그러기 위해서 dp 배열을 만들어서 금액 11이 되기 전까지의 각 금액에 도달하기까지의 최소 동전 개수를 저장하는 배열을 설계했다.
dp배열은 금액 0부터 amount(11)까지의 값까지의 값을 저장하며, 초기값은 아직 계산되지 않은 상태를 표현하기 위해 무한대 값( float('inf') ) 으로 설정했다.
또한, dp[0] = 0으로 초기화한 이유는 금액이 0일 때 필요한 동전 개수는 0개이기 때문이다.
6라인은 금액 1부터 11까지의를 순차적으로 계산하기 위한 for문이다.
7라인은 현재 사용 가능한 코인(denomination)을 하나씩 대입하면서 최소값을 찾는 과정이다.
점화식 dp[i] = min(dp[i], dp[i - coin] + 1)은 현재 코인을 사용했을 때의 동전 개수와 이미 저장된 최소값을 비교해 더 작은 값을 저장하는 역할을 한다.
모든 for문이 실행되면 dp배열에는 0부터 11까지의 각 금액을 만들기 위한 최소 동전 개수가 저장된다.
마지막으로 dp[amount] ( dp[11] )에 값이 존재하면 해당 금액을 만들기 위해 필요한 최소 동전 개수를 반환하고, 만약 값이 여전히 무한대라면 해당 금액을 만들 수 없다는 의미이므로 -1을 반환한다.
'[Snow-ball]프로그래밍(컴퓨터) > Algorithm' 카테고리의 다른 글
[Algorithm] 최장 공통 부분 수열(Longest Common Subsequence)로 공부하는 동적 프로그래밍(Dynamic Programming) (0) | 2025.01.01 |
---|---|
[Algorithm] 혼자서 하는 틱택토 ( Programmers / Python ) (0) | 2024.06.11 |
[Algorithm] 달리기 경주 (JavaScript - Programmers) (0) | 2023.04.11 |
[Algorithm] 욕심쟁이 알고리즘 배낭무게 문제풀이 [C++] (0) | 2022.04.28 |
[algorithm 이론] for문 사용할때 i++, ++i는 어떤 차이가 있을까? (0) | 2022.03.16 |