Codewars 7kyu 문제 Calculator: Coin Combination.
Codewars: Achieve mastery through challenge
Codewars is where developers achieve code mastery through challenge. Train on kata in the dojo and reach your highest potential.
www.codewars.com
미국 동전들인 penny(1센트)와 nickel(5센트), dime(10센트), quarter(25센트)를 최소로 사용해서 입력값에 해당하는 숫자를 만들어내고 사용한 동전의 개수를 담은 배열을 반환해야 함. 즉 a + b + c + d 값을 최소로 1 * a + 5 * b + 10 * c + 25 * d = 입력값 수식을 푸는 문제.
1. 채워넣기
function coinCombo(cents) {
let answer = [];
let quarter = 0;
let dime = 0;
let nickel = 0;
let penny = 0;
while ((quarter + 1) * 25 <= cents) quarter++;
while (quarter * 25 + (dime + 1) * 10 <= cents) dime++;
while (quarter * 25 + dime * 10 + (nickel + 1) * 5 <= cents) nickel++;
while (quarter * 25 + dime * 10 + nickel * 5 + penny < cents) penny++;
answer.push(penny, nickel, dime, quarter);
return answer;
}
while을 써서 단순하게 풀어봄. 큰 숫자부터 넘치지 않을 정도로 최대한 채움.
2. 나눗셈
1) 차례차례
function coinCombo(cents) {
let answer = [];
let quarter, dime, nickel, penny;
quarter = Math.floor(cents / 25);
cents -= quarter * 25;
dime = Math.floor(cents / 10);
cents -= dime * 10;
nickel = Math.floor(cents / 5);
cents -= nickel * 5;
penny = cents;
answer.push(penny, nickel, dime, quarter);
return answer;
}
채워넣기가 곱셈을 사용한 방법이었다면 이번엔 반대로 나눗셈으로 접근.
다른 답변들을 보니 이 과정을 반복문으로 구현했길래 연습해보기로.
2) 반복문
function coinCombo(cents) {
let answer = [];
const coinValue = [1, 5, 10, 25];
for (let i = coinValue.length - 1; i >= 0; i--) {
answer[i] = Math.floor(cents / coinValue[i]);
cents -= answer[i] * coinValue[i];
}
return answer;
}