코딩 테스트 공부

[백준 2294] 동전 2 (자바스크립트)

개발새발개발자_ 2025. 4. 3. 20:59

문제

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

입력

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

출력

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

 

2294번: 동전 2


#풀이 과정

dp는 처음 점화식의 개념을 잡는 게 항상 어려운 것 같다.

 

const input = require("fs")
  .readFileSync(
    process.platform === "linux" ? "/dev/stdin" : "./BOJ/BOJ_test.txt"
  )
  .toString()
  .trim()
  .split("\n");

// 동전 개수, 목표 값값
const [N, K] = input[0].split(" ").map(Number);
const coins = input.slice(1).map(Number);

// dp 배열 생성
const dp = new Array(K + 1).fill(Infinity);
dp[0] = 0;

for (let i = 0; i < N; i++) {
  const coin = coins[i];

  // coin 값부터 K 값까지
  for (let j = coin; j <= K; j++) {
    // j를 만드는 최소 개수 => (j - coin)를 만드는 최소 개수 + 1
    dp[j] = Math.min(dp[j], dp[j - coin] + 1);
  }
}

// dp[K]가 여전히 Infinity라면 -1 출력
console.log(dp[K] == Infinity ? -1 : dp[K]);