치춘짱베리굿나이스

[백준] 11047 본문

Javascript + Typescript/자바스크립트로 알고리즘풀기

[백준] 11047

치춘 2022. 6. 12. 22:47

동전 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보다 작을 경우 karr[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