코딩테스트/BOJ

[BOJ] 2294 동전 2 - JAVA

5월._. 2023. 5. 5.
728x90

1. 문제

 

2294번: 동전 2

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

www.acmicpc.net

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

사용한 동전의 구성이 같은데, 순서만 다른 것은 같은 경우이다.


2. 풀이

1.  DP를 이용했다. K+1칸 배열을 만들어서 최소값을 저장한다.

2.  한 동전을 여러 번 사용할 수 있으므로 dp[k]는 최대 10000이다. (동전 최소값 1원 * K의 최대값 10000원) 따라서 dp를 10001로 초기화한다.

3.  0원을 만드는 경우는 없다. dp[0]에 0을 저장하고 탐색을 시작한다.

4.  동전 하나씩 보면서, 동전값부터 K까지 탐색한다. dp[i] = min(dp[i], dp[i-동전값]+1)이다. for문의 조건이 i<=K이기 때문에 동전 하나의 값이 K보다 큰 경우에도 여기서 걸러진다.

5.  dp를 초기화한 값(10001)보다 dp[K]가 작다면 출력하고, 그 외는 K원을 만들 수 없는 경우이므로 -1을 출력한다.

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

public class BOJ_2294_동전2 {
   public static void main(String[] args) throws IOException {
      BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
      StringTokenizer st = new StringTokenizer(in.readLine());
      int N = Integer.parseInt(st.nextToken());
      int K = Integer.parseInt(st.nextToken());

      int[] coins = new int[N];
      for(int i=0;i<N;i++) {
         coins[i] = Integer.parseInt(in.readLine());
      }

      int[] dp = new int[K+1];
      Arrays.fill(dp, 10001);
      dp[0] = 0;

      for(int coin:coins){
         for(int i=coin;i<=K;i++) dp[i] = Math.min(dp[i], dp[i-coin]+1);
      }

      if(dp[K] < 10001) System.out.println(dp[K]);
      else System.out.println(-1);
   }
}

3. 결과

1.  동전은 K보다 클 수 있다.

2.  한 동전을 여러 번 사용할 수 있으므로 dp[k]는 최대 10000이다. (동전 최소값 1원 * K의 최대값 10000원) 따라서 dp를 10001로 초기화해야한다.

'코딩테스트 > BOJ' 카테고리의 다른 글

[BOJ] 9252 LCS 2 - JAVA  (0) 2023.05.07
[BOJ] 9251 LCS - JAVA  (0) 2023.05.06
[BOJ] 17087 숨바꼭질 6 - JAVA  (0) 2023.05.04
[BOJ] 16069 붙임성 좋은 총총이 - JAVA  (0) 2023.05.03
[BOJ] 17071 숨바꼭질 5 - JAVA  (0) 2023.05.02

댓글