코딩테스트

[백준] 거스름돈 (JS)

여유로운 프론트엔드 개발자 2025. 6. 13. 09:23

문제

https://www.acmicpc.net/problem/14916

춘향이는 편의점 카운터에서 일한다.

손님이 2원짜리와 5원짜리로만 거스름돈을 달라고 한다. 2원짜리 동전과 5원짜리 동전은 무한정 많이 가지고 있다. 동전의 개수가 최소가 되도록 거슬러 주어야 한다. 거스름돈이 n인 경우, 최소 동전의 개수가 몇 개인지 알려주는 프로그램을 작성하시오.

예를 들어, 거스름돈이 15원이면 5원짜리 3개를, 거스름돈이 14원이면 5원짜리 2개와 2원짜리 2개로 총 4개를, 거스름돈이 13원이면 5원짜리 1개와 2원짜리 4개로 총 5개를 주어야 동전의 개수가 최소가 된다.

입력

첫째 줄에 거스름돈 액수 n(1 ≤ n ≤ 100,000)이 주어진다.

출력

거스름돈 동전의 최소 개수를 출력한다. 만약 거슬러 줄 수 없으면 -1을 출력한다.

풀이

1. 이 문제는 그리디 알고리즘으로도 해결할 수 있지만, DP 방식으로 접근해 보았다.

2. 1원부터 9원까지는 최소 동전 개수를 직접 하드코딩하고, 10원부터는 규칙을 찾아 점화식을 적용했다.
구해본 결과, 현재 금액의 최소 동전 개수는 현재 금액 - 5의 최소 동전 개수에 1을 더한 값이라는 규칙을 발견할 수 있었다.

3. dp[i] 배열은 i + 1원을 의미하도록 구성되어 있으므로, dp[input - 1]이 정답이 된다.

const fs = require("fs");
const input = fs.readFileSync("/dev/stdin").toString().trim();

const Solution = (input) => {
    const dp = [-1, 1, -1, 2, 1, 3, 2, 4, 3];
    
    if (input >= 10) {
        for (let i = 9; i < input; i++) {
            dp[i] = dp[i - 5] + 1;
        }
    }
    
    console.log(dp[input - 1]);
}

Solution(Number(input));