프리코드 캠프에서 계산기 도전 해결

Dev의 첫 번째 댓글에 오신 걸 환영합니다!
Free Code Camp의 자바스크립트 알고리즘과 데이터 구조 인증을 받고 있다면 이 글에 관심이 있을 것입니다.
저는 my solution 뒤의 사고 과정을 거쳐 인증의 마지막 도전인 수신기에 대응할 것입니다.나는 그것이 상당히 복잡하다는 것을 발견했다. 약 3일이 걸려야만 완성할 수 있다.
이 가이드의 목표는 다른 개발자와 만나 이 도전에 대응하는 최선의 방법을 공유하는 것이다. 왜냐하면 나는 내가 코드를 크게 개선할 수 있다고 믿기 때문이다.따라서 반드시 댓글을 남기고 연결해 주십시오!

우선 문제는
도전은 당신에게 세 가지 파라미터가 있는 CheckCashRegister 함수를 제공합니다. 가격(구매한 가격), 현금(받은 돈을 구매)과cid(현재 사용 가능한 서랍의 현금)입니다.
function checkCashRegister(price, cash, cid) {

}

checkCashRegister(19.5, 20, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.1], ["QUARTER", 4.25], ["ONE", 90], ["FIVE", 55], ["TEN", 20], ["TWENTY", 60], ["ONE HUNDRED", 100]]);
마지막 매개 변수 cid는 서랍에 있는 서로 다른 동전과 지폐의 수를 포함하는 2D 배열로 구성되어 있다.
함수의 주요 목표는 두 가지 속성을 가진 대상인 status와change를 되돌려 주는 것이다.이 속성의 값은 사용 가능한cid와 우리가 되돌려야 할 변경 사항에 따라 달라집니다.다음과 같은 세 가지 상황이 있습니다.
  • 우리 서랍 안의 현금이 잔돈보다 적다는 것은 우리가 잔돈을 돌려줄 충분한 돈이 없거나 정확한 잔돈을 돌려줄 수 없다는 것을 의미한다.이것은 우리가 0.5달러를 반환해야 하지만 1달러짜리 지폐만 있으면 거스름돈을 돌려주지 않는다는 것을 의미한다.
    이 경우 반환되는 값은 {status: "uncipled FUNDS",change: []}
  • 입니다.
    우리 서랍 안의 현금과 잔돈은 서로 같다.이 경우, 우리의cid는 키가 변경된 값입니다: {status: "CLOSED",change: [cid]}.서랍 안의 현금이 잔돈보다 높다.이 경우,change의 값은 가장 높은 순서에서 가장 낮은 순서로 되돌아오는 서로 다른 지폐와 동전을 포함하는 그룹입니다.
    해결 방안을 분해하다.
    첫 번째 단계는 우리가 무엇을 돌려줘야 하는지를 정의하고 현금과 지불 가격 사이의 보증금을 계산하는 변수차를 만드는 것이다.
    function checkCashRegister(price, cash, cid) {
      var difference = cash - price;
      const originalDiff = difference;
      var objectReturn = {
        status: '',
        change: []
      }
    
    let arrCurrency = [
        ["ONE HUNDRED", 100], 
        ["TWENTY", 20], 
        ["TEN", 10], 
        ["FIVE", 5], 
        ["ONE", 1], 
        ["QUARTER", 0.25],
        ["DIME", 0.1],
        ["NICKEL", 0.05],
        ["PENNY", 0.01]
        ]
    
    
    이 변수는 코드에서 더 바뀔 것입니다.이것이 바로 원본 차이를 저장하기 위해 Const orginal Diff를 만드는 이유입니다.우리는 코드에서 이 변수를 사용하여 세 가지 가능한 결과를 정의해야 한다.
    ObjectReturn이라는 반환 객체도 작성했는데 이 객체에는 두 가지 속성이 있습니다.현재 상태는 빈 문자열로 설정되고, 변경은 빈 그룹으로 설정됩니다.
    또한 그룹에서 문장의 다른 화폐 값을 복제하기 위해 변수arrCurrency를 만들 것입니다.우리는 잠시 후에 이 그룹을 사용하여 모든 화폐의 가용성을 계산할 것이다.
    그 다음에 우리의 첫 번째 조작은 원시적인cid수조를 반전시키는 것이다.cid는 승차순으로 제공되지만, 모든 하위 그룹과arrCurrency 그룹의 상응하는 하위 그룹을 비교할 수 있도록 반전시킵니다.
    그리고, 우리는 변수cidSum을 만들고, for 순환을 사용하여 서랍의 모든 돈을 합친다.cidSum과originalDiff를 비교하면 우리는 세 가지 가능한 보답을 창조할 수 있다.
    cid.reverse();
    
      var cidSum = 0;
      for(let i = 0; i<cid.length; i++){
        cidSum += cid[i][1];
      }
    
    지금은 복잡한 부분이다.우리는 적당한 화폐로 잔돈을 반환하는 방법을 찾아야 한다.
    이를 위해, 우리는 for 순환을 사용할 것입니다. 이 순환은 그룹의 다른 화폐를 두루 훑어볼 것입니다.
    우선,spread 조작부호를 사용하여arrCurrency의 모든 정확한 값을 복사하는result라는 새 그룹을 만듭니다.매번 교체할 때마다, 우리는 결과 수조에서 모든 화폐의 값을 변경에 필요한 숫자로 변경할 것이다.
    var result = [...arrCurrency];
    
      for(let i = 0; i<arrCurrency.length; i++){
        let returnMoney = 0; 
        let bill = cid[i][1]/arrCurrency[i][1]
          bill.toFixed(2);
          while(difference.toFixed(2)>=arrCurrency[i][1] && bill>=1){
            difference -= arrCurrency[i][1];
            returnMoney += arrCurrency[i][1];
            bill--;
    
          }
            if(returnMoney>0){
              if(returnMoney - Math.floor(returnMoney) !== 0){result[i][1]= returnMoney.toFixed(2)
              result[i][1] = parseFloat(result[i][1])}else{
                result[i][1]= returnMoney;
              }
    
            }else{
              result[i][1]= returnMoney;
            }
      }
    
    for 주기 중:
  • 우리는 가변적인returnMoney를 만들었다. 우리는 그 중에서 동전 하나하나의 가치를 저장하고 잔돈의 가치를 계산할 것이다.
  • 우리는 모든 화폐에 사용 가능한 자금이 있는지 알아야 한다.이를 위해, 우리는 서랍에 있는 모든 화폐를 대응하는 화폐로 나누고, 숫자를 두 자리 소수로 반올림하는 가변 어음을 만들었다.만약 계산서가 1보다 크거나 같다면, 이것은 우리가 사용할 수 있는 화폐가 있다는 것을 의미한다.
  • while 순환을 만들었습니다.차액이 현재 교체된 화폐보다 크고 빌이 1보다 크면 순환은 계속해서 화폐의 가치를 차액에서 줄이고 같은 화폐를 우리의 가변 화폐에 추가할 것이다.
  • 차액이 화폐가치보다 낮거나 우리의 돈이 다 떨어지면 우리는if문장으로 넘어간다.만약returnMoney가 0보다 크다면, 이것은 우리가 이 지폐나 동전의 잔돈을 되돌려준다는 것을 의미하며, 우리는 이 숫자가 반올림이 필요한지 평가해야 한다.
  • 질문 중 하나는 JavaScript의 부동 소수점 정밀도입니다.두 번째if문장은 수학 공식에서 최대 정수를 빼서 숫자가 10진법인지 아닌지를 판단한다.마루법.(Ex=5.05 - 수학 바닥(5.05)=0.05).만약 결과가 0보다 크다면, 그것은 숫자를 두 자리의 소수로 반올림할 것이다.toFixed 방법이 문자열을 되돌려주기 때문에 테스트를 통과하기 위해 다시 숫자로 변환해야 합니다.
    모든 상황에서, 우리는 최종적으로 ReturnMoney로 결과 그룹의 화폐의 원시 값을 변경할 것이다.
    도전의 마지막 부분에 들어가기 전에, 우리는 정확한 변경 사항을 되돌릴 수 있는지 계산해야 한다.
    이를 위해, 우리는 수조result에 저장된 모든 값과 변수sumResult를 더한 다른for순환을 만들었습니다.앞에서 for 순환에서 계산한 바와 같이 사용 가능한 화폐에 따라 피드백 변경은 모든 값의 총계가 원시적인 차이보다 작으면 정확한 변경을 할 수 없다는 것을 의미합니다.
    let sumResult = 0;
    
      for(let i = 0; i<cid.length; i++){
        sumResult += result[i][1];
      }
      sumResult = sumResult.toFixed(2);
    
    우리의 마지막 if 성명은 세 가지 가능한 결과를 정의했다.
    if(cidSum < originalDiff || sumResult < originalDiff){
        objectReturn.status = 'INSUFFICIENT_FUNDS';
        }else if(cidSum == originalDiff){
          objectReturn.status = 'CLOSED';
          objectReturn.change = cid
        }else{
          let resultFiltered =[];
          for(let a = 0; a<result.length; a++){
            if(result[a][1]!==0){
              resultFiltered.push(result[a]);  
            } 
            }
         objectReturn.status = 'OPEN';
         objectReturn.change = resultFiltered;
        }
         return objectReturn;
    }
    
  • 만약에 우리측 서랍 속의 현금 총액 또는 사용 가능한 화폐 총액이 반환차액보다 적으면 우리측 대상의 재산상태를'자금부족'으로 변하게 한다.
  • 만약에 우리 서랍 안의 현금과 우리의 차액이 같다면 그것은 물품의 두 가지 속성을 바꿀 것이다.
  • 마지막으로 서랍의 현금 총계가 차치보다 크면 결과 그룹의 필터 그룹을 만들고 모든 값이 0인 동전을 포함하지 않으며 속성을 상응하는 값으로 변경합니다.
  • 마지막으로 우리는 이 대상으로 돌아갈 것이다.
    나는 네가 이 지루한 문장이 마침내 끝났다는 것을 깨달았을 때, 너는 반드시 기쁘게 울 것이라고 믿는다.간결하고 이야기를 하는 것이 결코 내가 가장 잘하는 기술이 아니기 때문에 네가 그것을 이해하길 바란다.
    어쨌든, 평론에서 당신이 코드에 대한 견해를 저에게 알려주시고, 개선 건의를 해 주십시오. 우리는 감격해 마지 않을 것입니다.
    또한 myGithub에서 전체 솔루션을 볼 수 있습니다.

    좋은 웹페이지 즐겨찾기