문제
n가지 종류의 동전이 있다. 이 동전들을 적당히 사용해서, 그 가치의 합이 k원이 되도록 하고 싶다. 그러면서 동전의 개수가 최소가 되도록 하려고 한다. 각각의 동전은 몇 개라도 사용할 수 있다.
입력
첫째 줄에 n, k가 주어진다. (1 ≤ n ≤ 100, 1 ≤ k ≤ 10,000) 다음 n개의 줄에는 각각의 동전의 가치가 주어진다. 동전의 가치는 100,000보다 작거나 같은 자연수이다. 가치가 같은 동전이 여러 번 주어질 수도 있다.
출력
#풀이 과정
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]);
'코딩 테스트 공부' 카테고리의 다른 글
[백준 12933] 오리 (자바스크립트) (0) | 2025.04.17 |
---|---|
[백준 1700] 멀티탭 스케줄링 (자바스크립트) (0) | 2025.04.17 |
[백준 2346] 풍선 터뜨리기 (자바스크립트) (0) | 2025.04.03 |
[백준 2468] 안전 영역 (자바스크립트) (0) | 2025.04.02 |
[백준 1535] 안녕 (자바스크립트) (0) | 2025.03.13 |