백준 14916번 - 거스름돈
거스름돈 문제 바로 가기
풀이 날짜: 2026-01-13
baekjoon 알고리즘 문제 풀이
풀이 코드
import sys
input = sys.stdin.readline
n = int(input())
INF = 100000
dp = [INF] * (n+1)
dp[0] = 0
for i in range(1,n+1):
if i>=2:
dp[i] = min(dp[i], dp[i-2]+1)
if i>=5:
dp[i] = min(dp[i], dp[i-5]+1)
if dp[n] == INF:
print(-1)
else:
print(dp[n])
문제 접근
이 문제는 2원과 5원 동전만을 사용해 주어진 금액을 만들 때 필요한 최소 동전 개수를 구하는 문제다. 처음에는 5원을 최대한 쓰는 방식의 그리디로 접근할 수 있을 것처럼 보이지만, 일부 금액(예: 13원)에서는 단순한 직관이 쉽게 깨진다. 따라서 이 문제는 “이 금액을 만들 수 있는 최소 개수”를 누적해서 계산하는 동적 계획법(DP) 으로 접근하는 것이 가장 안전하다.
DP 정의
- dp[i] = i원을 만들기 위해 필요한 최소 동전 개수
헷갈렸던 점 정리
초기값 설정의 중요성
처음에는 dp = [0] * (n+1) 처럼 초기화하려고 했지만, 이는 모든 금액을 0개의 동전으로 만들 수 있다고 착각하게 만드는 위험한 초기화다. 따라서 만들 수 없는 상태를 명확히 구분하기 위해 다음과 같이 설정했다.
- dp[0] = 0 → 0원은 동전 0개
- 나머지는 모두 INF → 아직 만들 수 없음을 의미