가치투자자
[BOJ] 11047번 : 동전 0 본문
백준 11047번 : 동전 0
🔗 문제 링크
https://www.acmicpc.net/problem/11047
11047번: 동전 0
첫째 줄에 N과 K가 주어진다. (1 ≤ N ≤ 10, 1 ≤ K ≤ 100,000,000) 둘째 줄부터 N개의 줄에 동전의 가치 Ai가 오름차순으로 주어진다. (1 ≤ Ai ≤ 1,000,000, A1 = 1, i ≥ 2인 경우에 Ai는 Ai-1의 배수)
www.acmicpc.net
💬 문제
그리디(greedy) 알고리즘 에 대한 이해가 있다면, 충분히 풀 수 있는 문제다.
- 동전의 종류는 N개이며, 각 동전의 개수는 많이 존재한다.
- N종류의 동전을 사용하여 K 금액을 만들려고 한다.
- 이때 필요한 동전 개수의 최솟값을 구해주면 된다
💡 입력값 받아오기
JavaScript로 풀 경우, 입력값(input)을 어떻게 받아와야 할 지가 중요하다.
이 문제에서는 1번째 줄에 N과 K가 공백을 기준으로 주어지고, 2번째 줄부터 N개의 줄에 오름차순으로 동전의 가격이 나열되어 있다. 각각을 스페이스 기준으로 잘라주고 정수화한 다음 할당해주면 된다.
입력값을 받아오는 것과 관련해 더 자세한 내용은 아래 링크를 참고 바란다.
https://valueengine.tistory.com/2
[BOJ] JS로 백준(BOJ) 푸는 법 및 VSCode 환경 세팅
JS로 백준 푸는 법 1. Node.js fs모듈 사용법 백준에서 JavaScript로 문제를 풀기 위해선 Node.js를 사용해야 하며, 이때 readline 모듈이나 fs 모듈로 입력값(input)을 받아와야 한다. 이 중 속도나 코드의 길
valueengine.tistory.com
💻 풀이
이 문제는 총 2가지 방식으로 풀어볼 수 있다.
🔑 풀이1 : for문 활용
- K는 동전 금액으로 구성되어 있기에 큰 금액부터 나눠 최소 개수를 구해준다.
- arr에는 동전 금액이 오름차순으로 정렬되어 있으므로 배열의 끝의 가장 큰 금액부터 시작해준다.
- K를 나눴을 때의 몫이 동전의 개수가 되고, 나머지는 잔돈이기에 나머지를 K에 재할당해준다. - 이런 방식으로 가장 큰 금액부터 가장 작은 금액까지 K를 나눠 동전의 개수 cnt를 누적해 출력해준다.
// input값 처리
const input = require('fs').readFileSync('/dev/stdin').toString().trim().split(/\s/).map(Number);
const [N, K, ...arr] = input;
console.log(solution(N, K, arr));
// 동전 개수 최솟값
function solution(N, K, arr) {
let cnt = 0;
for (let i=N-1; i >= 0; i--) {
cnt += parseInt(K / arr[i]); // 동전의 개수
K %= arr[i]; // 잔돈
}
return cnt;
}
시간은 다음과 같이 걸렸다.
🔑 풀이2 : reduce 메서드 활용
- reduce를 활용하기 위해 동전 배열을 reverse()를 사용해 내림차순으로 바꿔준다.
- 처음 누적 개수는 0이고, K를 동전 금액으로 나눠 동전 개수를 cnt에 누적해준다.
- reduce 메서드는 동전 배열 arr에서 동전을 하나식(cur) 꺼내준다
- K를 나눴을 때의 몫이 동전의 개수가 되고, 나머지는 잔돈이기에 나머지를 K에 재할당해준다 - 이런 방식으로 가장 큰 금액부터 가장 작은 금액까지 K를 나눠 동전의 개수 cnt를 누적해 출력해준다.
// input값 처리
const input = require('fs').readFileSync('/dev/stdin').toString().trim().split(/\s/).map(Number);
let [N, K, ...arr] = input;
arr = arr.reverse();
console.log(solution(K, arr));
// 동전 개수 최솟값
function solution(K, arr) {
return arr.reduce((acc, cur) => {
let cnt = acc + Math.floor(K / cur); // 동전의 개수
K %= cur; // 잔돈
return cnt;
}, 0)
}
주의할 점은 reduce 메서드 내에만 return을 해주면 reduce 메서드 내에서 cnt가 누적이 되었지만, 해당 누적값 cnt를 함수에서 반환하고 있지 않아서 undefined가 출력된다. 꼭 최종 반환값을 return 해주고 있는지 확인하자!
// 동전 개수 최솟값
function solution(K, arr) {
arr.reduce((acc, cur) => {
let cnt = acc + Math.floor(K / cur); // 동전의 개수
K %= cur; // 잔돈
return cnt;
}, 0)
}
시간은 다음과 같이 걸렸다.
'Problem Solving > BOJ' 카테고리의 다른 글
[BOJ] 1080번 : 행렬 (0) | 2023.06.07 |
---|---|
[BOJ] 2002번 : 추월 (0) | 2023.05.31 |
[BOJ] 1075번 : 나누기 (0) | 2023.04.25 |
[BOJ] 2798번 : 블랙잭 (1) | 2023.04.22 |
[BOJ] 3085번 : 사탕 게임 (0) | 2023.04.22 |