프리코드 캠프에서 계산기 도전 해결
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와 우리가 되돌려야 할 변경 사항에 따라 달라집니다.다음과 같은 세 가지 상황이 있습니다.
이 경우 반환되는 값은 {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로 결과 그룹의 화폐의 원시 값을 변경할 것이다.
도전의 마지막 부분에 들어가기 전에, 우리는 정확한 변경 사항을 되돌릴 수 있는지 계산해야 한다.
이를 위해, 우리는 수조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;
}
나는 네가 이 지루한 문장이 마침내 끝났다는 것을 깨달았을 때, 너는 반드시 기쁘게 울 것이라고 믿는다.간결하고 이야기를 하는 것이 결코 내가 가장 잘하는 기술이 아니기 때문에 네가 그것을 이해하길 바란다.
어쨌든, 평론에서 당신이 코드에 대한 견해를 저에게 알려주시고, 개선 건의를 해 주십시오. 우리는 감격해 마지 않을 것입니다.
또한 myGithub에서 전체 솔루션을 볼 수 있습니다.
Reference
이 문제에 관하여(프리코드 캠프에서 계산기 도전 해결), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/ainaperez/solving-the-cash-register-challenge-in-free-code-camp-12dk텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)