본문 바로가기
프로그래밍/Javascript

JavaScript 기초 : 실전 예제 2. 거스름돈 구하기! - Math.floor()와 함수 이용

by 조크리 2020. 9. 17.
반응형

2. 거스름돈 구하기

 

실전예제 1에서는 for문을 이용해 팩토리얼 값을 구해보았다. 

JavaScript 기초 : 실전 예제 1. 팩토리얼(factorial) - for 반복문 사용

 

이번에는 거스름돈을 구해주는 예제를 살펴보자. 

 

이 예제는 파이썬을 공부할 때도 나왔던 예제이다.

 

일단 사람이 계산하는 것처럼 생각해봐야한다.

 

100,000원을 냈고 물건 값은 35,000이다. 

 

이 경우 거스름돈은 어떻게 줄 수 있을까?

 

전체 거스름돈은 100,000 - 35,000 = 65,000원이다. 

 

그 다음 가장 큰 지폐권인 5만원권을 몇 개 줘야하는지 확인해야한다. 

65,000 / 50,000 = 1 ... 15,000 이다.

 

그럼 5만원 권은 1개 주면 된다. 

 

이제 1만원권을 생각해보자. 

 

15,000 / 10,000 = 1 ... 5,000 이다. 

 

전에 파이썬으로 예제를 풀었을 때는 5만원권, 1만원권, 5천원권, 1천원권의 장수를 변수로 선언하였다. 

5만원권 장수가 변수니까 총 거스름돈에서 5만원권을 나눈 몫만 알면 된다. 

1만원권의 경우 총 거스름돈에서 5만원권으로 준 금액을 빼고 1만원으로 나눈 몫을 알면 된다. 

5천원권의 경우 총 거스름돈에서 5만원권으로 준 금액을 빼고 1만원권으로 준 금액을 빼고 5천원으로 나눈 몫을 알면 된다. 

1천원권의 경우 총 거스름돈에서 5만원권으로 준 금액을 빼고, 1만원권으로 준 금액을 빼고, 5천원권으로 준 금액을 빼고, 1천원으로 나눈 몫을 알면된다. 

 

//5만원권, 1만원권, 5천원권, 1천원권의 장수를 변수로 선언

function calculateChange(payment, cost) {
  let payBack = payment - cost
  let fiftyThousand = Math.floor(payBack / 50000);
  let tenThousand = Math.floor((payBack - fiftyThousand * 50000) / 10000);
  let fiveThousand = Math.floor((payBack - fiftyThousand * 50000 - tenThousand * 10000)/ 5000);
  let oneThousand = Math.floor((payBack - fiftyThousand * 50000 - tenThousand * 10000 - fiveThousand * 5000)/1000);;
  console.log(`50000원 지폐 : ${fiftyThousand}장`);
  console.log(`10000원 지폐 : ${tenThousand}장`);
  console.log(`5000원 지폐 : ${fiveThousand}장`);
  console.log(`1000원 지폐 : ${oneThousand}장`);

}

// 테스트
calculateChange(100000, 33000)
console.log('');
calculateChange(500000, 378000)

 

이 경우 거스름돈 총액인 payBack은 그대로 둔 상태에서 계속 빼기 빼기를 해주는 형태로 코드를 쓴 것이라 낮은 단위의 지폐로 갈수록 수식이 매우 길어진다. 

 

그럼 payBack 자체를

계산하고 남은 나머지로 변환시켜주면 어떨까?

 

 

변수 선언도 다시 해보자.

변수 이름 짓는 것도 매우 중요하다.

 

change를 거스름 총액이라고 선언한다.

 

거스름돈에서, 50,000원으로 나눠떨어지지 않는 나머지를 뺀 다음, 다시 50,000을 나눠주면 거스름돈을 지폐 금액만큼 나눠준 개수를 얻을 수 있다. 

change는 change - 5만원 * 5만원권 개수 값으로 대체시켜 준다.

그 다음은 10,0000원이다. 바뀐 change에서 10,000으로 나눠떨어지지 않는 나머지를 뺀 다음, 다시 10,000을 나눠주면 거스름돈을 지폐 금액만큼 나눠준 개수를 얻을 수 있다. 

change는 change - 1만원 * 1만원권 개수 값으로 대체시켜준다.

 

이렇게 쭉 내려가는 것이다. 

//거슬러주고 남은 값을 바로 계산헤서 change에 할당

function calculateChange(payment, cost) {
  let change = payment - cost; // 거스름돈 총액

  const fiftyCount = (change - (change % 50000)) / 50000;
  change = change - 50000 * fiftyCount;

  const tenCount = (change - (change % 10000)) / 10000;
  change = change - 10000 * tenCount;

  const fiveCount = (change - (change % 5000)) / 5000;
  change = change - 5000 * fiveCount;

  const oneCount = (change - (change % 1000)) / 1000;
  change = change - 1000 * oneCount;

  console.log(`50000원 지폐: ${fiftyCount}장`);
  console.log(`10000원 지폐: ${tenCount}장`);
  console.log(`5000원 지폐: ${fiveCount}장`);
  console.log(`1000원 지폐: ${oneCount}장`);

}

 

 

이번에는 floor 메소드를 활용해서 소수점 이하를 버리는 계산을 써보자!

floor를 이용하면 훨씬 코드가 간결해진다. 

//Math.floor는 소수점 이하는 버림이다. 즉, 몫에 해당하는 값만 구할 수 있다. 

function calculateChange(payment, cost) {
  let change = payment - cost; // 거스름돈 총액

  const fiftyCount = Math.floor(change / 50000);
  change = change - 50000 * fiftyCount;

  const tenCount = Math.floor(change / 10000);
  change = change - 10000 * tenCount;

  const fiveCount = Math.floor(change / 5000);
  change = change - 5000 * fiveCount;

  const oneCount = Math.floor(change / 1000);
  change = change - 1000 * oneCount;

  console.log(`50000원 지폐: ${fiftyCount}장`);
  console.log(`10000원 지폐: ${tenCount}장`);
  console.log(`5000원 지폐: ${fiveCount}장`);
  console.log(`1000원 지폐: ${oneCount}장`);
}

좀 더 간결하게 써볼까?

지폐 개수를 셀 때 지폐 단위를 제외하면, 똑같이 반복되는 부분들이 있다. 

지폐 단위도 똑같이 세 번, floor메소드를 쓰더라도 두 번은 반복되고 있다. 

 

함수나 반복문을 최대한 줄일 방법을 찾아야한다.

 

상황에 따라 변해야하는 부분은 지페 단위이니까 이 부분은 파라미터로 활용한다.

그리고 똑같이 반복되는 패턴을 추려서 동작 부분을 채운 함수를 작성해야 한다.

 

반복되는 동작은 

const 00Count = Math.floor( change / 00000);

change = change - 00000 * 00Count

 

이 부분을 함수로 두는 것이다!!

일단 화폐의 금액을 파라미터 amount로 두자.

그리고 화폐의 단위는 그냥 count라는 변수로 두자.

function calculateChange(payment, cost) {

  let change = payment - cost; // 거스름돈 총액

  function billCounting(amount) {
    const count = (change - (change % amount)) / amount;
    change = change - amount * count;
    return count;
    
  }

  const fiftyCount = billCounting(50000);
  const tenCount = billCounting(10000);
  const fiveCount = billCounting(5000);
  const oneCount = billCounting(1000);

  console.log(`50000원 지폐: ${fiftyCount}장`);
  console.log(`10000원 지폐: ${tenCount}장`);
  console.log(`5000원 지폐: ${fiveCount}장`);
  console.log(`1000원 지폐: ${oneCount}장`);
}

위의 코드는 Math.floor를 쓰지 않고 계산 식을 넣었다. 

하지만 기존에 변수를 화폐 금액권마다 설정하고 수식을 넣어주는 것보다는 훨씬 간단하다. 

 

 

Math.floor를 쓰면 더 간결해진다. 

함수가 딱 4줄로 정리된다.

function calculateChange(payment, cost) {

  let change = payment - cost; // 거스름돈 총액

  function billCounting(amount) {
    const count = Math.floor(change / amount);
    change = change - amount * count;
    return count;
  }

  const fiftyCount = billCounting(50000);
  const tenCount = billCounting(10000);
  const fiveCount = billCounting(5000);
  const oneCount = billCounting(1000);

  console.log(`50000원 지폐: ${fiftyCount}장`);
  console.log(`10000원 지폐: ${tenCount}장`);
  console.log(`5000원 지폐: ${fiveCount}장`);
  console.log(`1000원 지폐: ${oneCount}장`);
}

 함수를 만들 때의 핵심은

 

반복되는 패턴을 찾는것, 파라미터로 넣을 것을 찾는 것, 변수로 설정할 것을 찾는 것

 

이 3가지인 것 같다. 

 

거스름돈 구하기를 파이썬 기초에서 했을 때는 맨 위 변수 4개를 정하고 각 변수마다 식을 써주는 것까지만 했었다.

 

하지만 거스름돈 값 자체를 대체 시켜주는 것을 적용해 볼 수 있었고,

함수를 이용해서 코드를 완전 짧게 줄일 수도 있었다. 

 

최대로 효율적인 코드

유지 보수가 편리한 코드

이런 코드를 작성하는게 중요하는 것을 다시 한 번 느낀다.

 

패턴을 찾아 수식으로 나타내는 연습이 필요하고

파라미터로 쓰일 값을 찾는것, 

변수로 선언할 값을 찾는 것!

 

이러한 연습을 예제를 통해 계속 해야한다!!

 

 

다음에는 팰린드롬을 살펴보자!

 JavaScript 기초 : 실전 예제 3. 팰린드롬

 

 

반응형