728x90
반응형
오늘은 무엇을 배우게 될까요?
“500원, 100원, 50원이 있을 때 1000원을 만드는 방법은 몇 가지일까?”
이런 문제는 단순한 수학이 아니라, 조합과 최적화가 섞인 컴퓨터 알고리즘 문제입니다.
동전 교환 문제는
“정해진 동전 종류로 목표 금액을 만들기 위한 방법의 수 또는 최소 동전 수”를 구하는 문제입니다.
이 문제는 무한 배낭 문제의 대표적 사례입니다.
문제 유형 분류
동전 교환 문제는 크게 2가지 버전으로 나뉩니다
유형 설명 목표
방법 수 구하기 | 동전을 조합해 금액을 만들 수 있는 경우의 수 | 총 몇 가지 방법? |
최소 개수 구하기 | 해당 금액을 만들 수 있는 최소 동전 수 | 가장 효율적인 조합? |
유형 ①: 방법 수 구하기 (DP 방식)
문제 예시
- 동전 종류: [1, 2, 5]
- 목표 금액: 5
- 가능한 조합:
- 1+1+1+1+1
- 1+1+1+2
- 1+2+2
- 5
- …
- 결과: 4가지 방법
점화식 설계 (방법 수)
- dp[i]: i원을 만드는 방법의 수
- dp[0] = 1 (0원을 만드는 방법은 아무 동전도 쓰지 않는 1가지)
def count_ways(coins, target):
dp = [0] * (target + 1)
dp[0] = 1
for coin in coins:
for i in range(coin, target + 1):
dp[i] += dp[i - coin]
return dp[target]
print(count_ways([1, 2, 5], 5)) # 출력: 4
유형 ②: 최소 개수 구하기
이번엔 경우의 수가 아니라,
동전 개수를 최소로 써서 목표 금액을 만드는 게 목표입니다.
- 동전 종류: [1, 3, 4]
- 목표 금액: 6
- 최소 동전 수
- 3 + 3 = 2개
- 4 + 1 + 1 = 3개 → ❌
- 답: 2개
점화식 설계 (최소 개수)
- dp[i]: i원을 만드는 최소 동전 개수
- dp[0] = 0, 나머지는 inf로 초기화
- 점화식: dp[i] = min(dp[i], dp[i - coin] + 1)
def min_coins(coins, target):
dp = [float('inf')] * (target + 1)
dp[0] = 0
for coin in coins:
for i in range(coin, target + 1):
dp[i] = min(dp[i], dp[i - coin] + 1)
return dp[target] if dp[target] != float('inf') else -1
print(min_coins([1, 3, 4], 6)) # 출력: 2
시각적으로 요약해보자면
금액(i) 최소 동전 수 (coins=[1,3,4])
0 | 0 |
1 | 1 (1) |
2 | 2 (1+1) |
3 | 1 (3) |
4 | 1 (4) |
5 | 2 (1+4 or 1+1+3) |
6 | 2 (3+3) |
실제 활용 예시
활용 상황설명
거스름돈 계산 | 최소 동전 개수로 거슬러 주기 |
포인트 시스템 | 적은 자원으로 보상 구성 |
구매 조합 | 예산 내 다양한 조합 구하기 |
AI 게임 설계 | 자원 최소 소비 루트 찾기 |
한 줄 요약
👉 동전 교환 문제는 목표 금액을 만들기 위한 방법의 수 또는 최소 동전 수를 구하는 문제로,
무한 배낭 문제의 대표적인 실전 사례입니다.
728x90
반응형
'IT 초보 탈출 100일 챌린지' 카테고리의 다른 글
[100일의 IT 초보 탈출] #66 최소 편집 거리 _ 단어를 얼마나 바꿔야 할까? (2) | 2025.07.04 |
---|---|
[100일의 IT 초보 탈출] #65 LCS (최장 공통 부분 수열) _ 두 문자열의 공통된 흐름 찾기 (0) | 2025.07.04 |
[100일의 IT 초보 탈출] #63 무한 배낭 문제 _ 원하는 만큼 넣어도 될까? (0) | 2025.07.02 |
[100일의 IT 초보 탈출] #62 배낭 문제 _ 한정된 자원 안에서의 최적 선택 (0) | 2025.07.02 |
[100일의 IT 초보 탈출] #61 다이나믹 프로그래밍 _ 반복되는 계산을 저장하라! (1) | 2025.07.01 |