Algorithm/백준

[백준] 2294 동전 2 💰 (Java)

delayU 2024. 4. 21. 18:03
728x90

문제 링크

 

2294번: 동전 2

첫째 줄에 n, k가 주어진다. (1 ≤ n ≤ 100, 1 ≤ k ≤ 10,000) 다음 n개의 줄에는 각각의 동전의 가치가 주어진다. 동전의 가치는 100,000보다 작거나 같은 자연수이다. 가치가 같은 동전이 여러 번 주어

www.acmicpc.net

문제 설명

n가지 종류의 동전이 있다. 이 동전들을 적당히 사용해서, 그 가치의 합이 k원이 되도록 하고 싶다. 그러면서 동전의 개수가 최소가 되도록 하려고 한다. 각각의 동전은 몇 개라도 사용할 수 있다.

입력

첫째 줄에 n, k가 주어진다. (1 ≤ n ≤ 100, 1 ≤ k ≤ 10,000) 다음 n개의 줄에는 각각의 동전의 가치가 주어진다. 동전의 가치는 100,000보다 작거나 같은 자연수이다. 가치가 같은 동전이 여러 번 주어질 수도 있다.

출력

첫째 줄에 사용한 동전의 최소 개수를 출력한다. 불가능한 경우에는 -1을 출력한다.

구조화

1부터 k까지 각 수마다의 동전 최소 개수를 dp 배열에 저장

x원에 몇 개의 동전을 썼을 때, 최소인지 dp 배열을 계속 갱신

 

예제 1에서 봤을 때, dp[5]는 1 코인을 5개 쓰는 경우와 5 코인을 1개 쓰는 경우에서 -> 5 코인을 1개 쓰는 경우를 고르게 됨(더 적은 코인을 사용하기 때문)

3 15

1

5

12

오답 노트

동전 값에 대한 dp 배열 초기화 -> k가 더 작을 수 있어서 런타임 에러(ArrayIndexOutOfBounds)남

소스 코드

import java.io.*;
import java.util.*;

public class Main {
    public static int n, k;
    public static int[] coin;
    public static long[] dp;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        n = Integer.parseInt(st.nextToken());
        k = Integer.parseInt(st.nextToken());
        dp = new long[k+1];
        Arrays.fill(dp, Integer.MAX_VALUE);
        dp[0] = 0;

        coin = new int[n];
        for (int i = 0; i < n; i++) {
            coin[i] = Integer.parseInt(br.readLine());
        }

        for (int i = 1; i <= k; i++) {
            for (int j = 0; j < n; j++) {
                if (i-coin[j]>=0)
                    dp[i] = Math.min(dp[i], dp[i-coin[j]] + 1);
            }
        }

        System.out.println(dp[k] == Integer.MAX_VALUE ? -1 : dp[k]);
    }
}