치춘짱베리굿나이스
[백준] 11047 본문
동전 0
문제
준규가 가지고 있는 동전은 총 N종류이고, 각각의 동전을 매우 많이 가지고 있다.
동전을 적절히 사용해서 그 가치의 합을 K로 만들려고 한다. 이때 필요한 동전 개수의 최솟값을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N과 K가 주어진다. (1 ≤ N ≤ 10, 1 ≤ K ≤ 100,000,000)
둘째 줄부터 N개의 줄에 동전의 가치 Ai가 오름차순으로 주어진다. (1 ≤ Ai ≤ 1,000,000, A1 = 1, i ≥ 2인 경우에 Ai는 Ai-1의 배수)
출력
첫째 줄에 K원을 만드는데 필요한 동전 개수의 최솟값을 출력한다.
풀이
const coin = () => {
let [[n, k], ...arr] = require("fs")
.readFileSync("/dev/stdin")
.toString()
.trim()
.split("\n")
.map((v) => v.split(" ").map(Number));
let ans = 0;
for (let i = n - 1; i >= 0; i--) {
if (arr[i] > k) continue;
ans += Math.floor(k / arr[i]);
k %= arr[i];
}
console.log(ans);
};
coin();
반성회
동전의 가치가 오름차순으로 주어지므로, 맨 뒤의 동전 가치 (가장 큰 동전 가치) 부터 탐색하여 이 동전을 1개 이상 사용하여 k
보다 작은 수를 만들 수 있는지 알아본다
동전의 가치 arr[i]
가 k
보다 클 경우 이 동전으로는 k
를 만들 수 없다는 의미이고, k
보다 작을 경우 k
를 arr[i]
로 나누어준다
k
를 동전의 가치 arr[i]
로 나눈 몫이 k
를 만들기 위해 사용할 수 있는 최대 개수이며, 나머지는 이 동전으로 만들 수 없는 금액이 되므로 k
에 대입하고 다음 가치인 arr[i - 1]
로 넘어가서 같은 과정을 반복한다
최종적으로 지금까지 발생한 모든 몫을 더해주면 정답이 된다
사실 if (arr[i] > k) continue;
는 쓸 필요도 없다
Math.floor(k / arr[i])
가 0이 될 것이고, k % arr[i]
는 k
가 그대로 반환되기 때문이다
'Javascript + Typescript > 자바스크립트로 알고리즘풀기' 카테고리의 다른 글
[백준] 5597 (0) | 2022.06.17 |
---|---|
[백준] 23037 (0) | 2022.06.17 |
[백준] 1931 (0) | 2022.06.12 |
[백준] 24900 (0) | 2022.06.12 |
[백준] 25083 (0) | 2022.06.12 |
Comments