안녕하세요
우테코 프리코스 1주차 - 문제 5 (리팩토링O) 본문
https://github.com/youngentry/javascript-onboarding/blob/main/docs/PROBLEM5.md
🚀 기능 요구 사항
계좌에 들어있는 돈 일부를 은행에서 출금하고자 한다. 돈 담을 지갑이 최대한 가볍도록 큰 금액의 화폐 위주로 받는다.
돈의 액수 money가 매개변수로 주어질 때, 오만 원권, 만 원권, 오천 원권, 천 원권, 오백원 동전, 백원 동전, 오십원 동전, 십원 동전, 일원 동전 각 몇 개로 변환되는지 금액이 큰 순서대로 배열에 담아 return 하도록 solution 메서드를 완성하라.
제한사항
- money는 1 이상 1,000,000 이하인 자연수이다.
실행 결과 예시
moneyresult
50237 | [1, 0, 0, 0, 0, 2, 0, 3, 7] |
15000 | [0, 1, 1, 0, 0, 0, 0, 0, 0] |
좋았던 점
- 코드를 작성하기 전 설계한 그대로 코드를 작성하였더니 한 번만에 올바른 결과를 리턴할 수 있었습니다.
아쉬운 점
- while문에 대한 이해가 부족해 refactoring 과정에서 changes 에 값이 새롭게 할당되는 것을 인지하지 못하여 시간이 오래 걸렸습니다.
=> while문을 코딩테스트 문제들을 통해 연습해야겠습니다.
// 1. 0~8까지 인덱스별로 화폐의 단위를 각각 저장한 객체를 만듭니다.
// 2. 요소를 0으로 채운 길이가 9인 배열을 만듭니다.
// 3. 지불할 화폐의 수를 count 합니다.
// 4. 지불하려는 화폐의 단위로 나눈 몫이 0보다 크면 count에 몫을 더합니다.
// 5. 잔돈(changes)에서 지불한 비용만큼 빼줍니다.
// 6. 화폐의 단위에 해당하는 배열 인덱스마다 count를 더합니다.
// 7. 배열을 반환합니다.
function problem5(money) {
// 1. 0~8까지의 인덱스별로 화폐의 단위를 각각 저장한 객체를 만듭니다.
const values = {
0: 50000,
1: 10000,
2: 5000,
3: 1000,
4: 500,
5: 100,
6: 50,
7: 10,
8: 1,
};
// 2. 요소를 0으로 채운 길이가 9인 배열을 만듭니다.
const arr = Array.from({ length: 9 }, (el) => 0);
let changes = money;
for (i = 0; i < arr.length; i++) {
// 지불할 화폐의 수를 count 합니다.
let count = 0;
// 4. 조건) 현재 지불하려는 화폐의 단위로 나눈 몫이 0보다 크면 실행합니다.
while (Math.floor(changes / values[i]) > 0) {
// 4. 지불하려는 화폐의 단위로 나눈 몫이 0보다 크면 count에 몫을 더합니다.
count = Math.floor(changes / values[i]);
// 5. 잔돈(changes)에서 지불한 비용만큼 빼줍니다.
changes -= values[i] * Math.floor(changes / values[i]);
// 6. 화폐의 단위에 해당하는 배열 인덱스에 count만큼을 더합니다.
arr[i] += count;
}
}
// 7. 배열을 반환합니다.
console.log(arr);
return arr;
}
problem5(50237);
problem5(15000);
리팩토링 전
function problem5(money) {
const values = {
0: 50000,
1: 10000,
2: 5000,
3: 1000,
4: 500,
5: 100,
6: 50,
7: 10,
8: 1,
};
const arr = Array.from({ length: 9 }, (el) => 0);
let changes = money;
for (i = 0; i < arr.length; i++) {
let count = 0;
while (Math.floor(changes / values[i]) > 0) {
count = Math.floor(changes / values[i]);
changes -= values[i] * Math.floor(changes / values[i]);
arr[i] += count;
}
}
return arr;
}
problem5(50237);
problem5(15000);
리팩토링 후
- 변수명 직관적으로 수정
- count 과정이 불필요하다는 것을 알고 과정을 줄임
function problem5(money) {
const values = {
0: 50000,
1: 10000,
2: 5000,
3: 1000,
4: 500,
5: 100,
6: 50,
7: 10,
8: 1,
};
const currencyArray = Array.from({ length: 9 }, (el) => 0);
let changes = money;
for (i = 0; i < currencyArray.length; i++) {
let currencyUnit = values[i];
while (Math.floor(changes / currencyUnit) > 0) {
currencyArray[i] += Math.floor(changes / currencyUnit);
changes -= currencyUnit * Math.floor(changes / currencyUnit);
}
}
return currencyArray;
}
module.exports = problem5;
'우테코 프리코스 > 1주차' 카테고리의 다른 글
우테코 프리코스 1주차 - 문제 7 (리팩토링O) (0) | 2022.11.01 |
---|---|
우테코 프리코스 1주차 - 문제 6 (리팩토링O) (0) | 2022.11.01 |
우테코 프리코스 1주차 - 문제 4 (리팩토링O) (0) | 2022.10.29 |
우테코 프리코스 1주차 - 문제 3 (0) | 2022.10.29 |
우테코 프리코스 1주차 - 문제 2 (0) | 2022.10.27 |