안녕하세요

우테코 프리코스 1주차 - 문제 5 (리팩토링O) 본문

우테코 프리코스/1주차

우테코 프리코스 1주차 - 문제 5 (리팩토링O)

sakuraop 2022. 10. 29. 03:06

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;