본문 바로가기
백준/DP

백준 2294. 동전 2

by 29살아저씨 2021. 9. 26.
반응형

🅰 백준 2294. 동전 2

 

2294번: 동전 2

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

www.acmicpc.net

✏️ 문제 풀이

  • coin배열에 사용할 수 있는 동전을 전부 저장한다.
  • 이중for문을 이용해서 바깥쪽 for문에는 coin의 개수만큼 반복하고, 안쪽 for문에는 가치의 합인 k만큼 반복을 한다
  • 점화식 : if(j-coin[i] >= 0 && D[j-coin[i]!=max_value) : D[j] = min(D[j], 1 + D[j - coin[i]])
  • 만약 j를 현재 coin[i]로 계산할 수 있고, 이전에D[j-coin[i]] 의 데이터가 있다면 D[j] 최신화
  • 만약 D[k]가 초기값이라면 -1 출력 / 아니면 D[k]에 저장된 값 출력

✏️ 소스코드

package dp;

import java.io.*;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main_실버1_2294_동전2 {
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");

		int n = Integer.parseInt(st.nextToken());
		int k = Integer.parseInt(st.nextToken());
		int coin[] = new int[n];
		int D[] = new int[k + 1];
		Arrays.fill(D, Integer.MAX_VALUE);
		for (int i = 0; i < n; i++) { // 데이터 입력
			coin[i] = Integer.parseInt(br.readLine());
		}
		D[0] = 0;
		for (int i = 0; i < n; i++) {	// coin의 개수만큼 반복
			for (int j = 1; j <= k; j++) {	// 1부터 k까지 반복
				if (j - coin[i] >= 0 && D[j-coin[i]]!=Integer.MAX_VALUE) {	
                // 만약 coin[i]로 j를 계산할 수 있다면
					D[j] = Math.min(D[j], 1 + D[j - coin[i]]);				
                    // 현재 D[j]와 D[j-coin[i]]에 현재 coin을 1개 추가한 값의 최소값 저장
				}
			}
		}
		if (D[k] == Integer.MAX_VALUE)
			System.out.println(-1);
		else
			System.out.println(D[k]);
	}
}

 

✅ 후기

  • 점화식을 세우는건 아직 어려운것 같다.. 더 많은 dp문제를 풀어봐야겠다
반응형

'백준 > DP' 카테고리의 다른 글

백준 12920. 평범한 배낭 2  (0) 2021.09.27
백준 12865. 평범한 배낭  (0) 2021.09.26
백준 11066 파일합치기  (0) 2021.09.26
백준 1890. 점프  (0) 2021.09.23
백준 11048. 이동하기  (0) 2021.09.23

댓글