본문 바로가기

알고리즘(백준 등) 공부/백준(자바)

백준 1398번: 동전 문제

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

 

1398번: 동전 문제

첫째 줄에 테스트 케이스의 개수 T가 주어진다. 둘째 줄부터 T개의 줄에 초콜릿의 가격이 주어진다. 가격의 1015보다 작거나 같은 자연수이다.

www.acmicpc.net

 

k>=0 인 k에 대해서 동전의 종류는 10^k, 25*100^k 로 이루어질 때, 비용을 계산하는 최소한의 동전 갯수를 구하는 문제이다.

 

처음에는 Greedy 방식으로 비용을 비용보다 작은 가장 비싼 동전으로 차감하면서 찾았으나 더 싼 동전으로 더 적은 동전의 갯수만으로 지불할 수 있음을 알게 되었다. 그래서 동전의 종류들을 크기 순서로 나열해 본 결과 동전이 (1 * 10^k, 10 * 10^k, 25 * 10^k ) 구간이 반복됨을 알게 되었고 1~99 구간의 최소 동전의 갯수를 구한 뒤, 비용을 100으로 나누어 가면서 동전의 갯수를 구하면 됨을 알게 되었다. 최소 동전 갯수는 dp로 구하였다.

int[] dp = new int[100];
for (int i = 1; i < 100; i++) {
    dp[i] = i;
    if (i >= 10) {
        dp[i] = Math.min(dp[i], dp[i - 10] + 1);
    }
    if (i >= 25) {
        dp[i] = Math.min(dp[i], dp[i - 25] + 1);
    }
}

 

 

이후, 각각의 비용들을 100으로 나누면서 나머지에 대해 필요한 동전의 갯수를 dp에서 찾아서 누적해준다.

while (t-- > 0) {
    long money = Long.parseLong(br.readLine());
    long totalCoins = 0;
    while (money > 0) {
        int remainder = (int) (money % 100);
        totalCoins += dp[remainder];
        money /= 100;
    }
    sb.append(totalCoins).append('\n');
}

 

 

결과 코드는 다음과 같다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class 동전문제1398 {
    
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int[] dp = new int[100];
        for (int i = 1; i < 100; i++) {
            dp[i] = i;
            if (i >= 10) {
                dp[i] = Math.min(dp[i], dp[i - 10] + 1);
            }
            if (i >= 25) {
                dp[i] = Math.min(dp[i], dp[i - 25] + 1);
            }
        }
        
        int t = Integer.parseInt(br.readLine());
        StringBuilder sb = new StringBuilder();
        
        while (t-- > 0) {
            long money = Long.parseLong(br.readLine());
            long totalCoins = 0;
            while (money > 0) {
                int remainder = (int) (money % 100);
                totalCoins += dp[remainder];
                money /= 100;
            }
            sb.append(totalCoins).append('\n');
        }
        br.close();
        System.out.print(sb);
    }
}

'알고리즘(백준 등) 공부 > 백준(자바)' 카테고리의 다른 글

백준 1405번: 미친 로봇  (1) 2026.04.18
백준 1400번: 화물차  (0) 2026.04.18
백준 1379번 강의실 2  (1) 2026.04.15
백준 1374: 강의실  (0) 2026.04.13
백준 1369번: 배열값  (0) 2026.04.12