자바스크립트 챌린지 5: 제빵사 피트
This article was originally posted on my blog. Head over to inspiredwebdev.com for more articles and tutorials. Check out my JavaScript course on Educative to learn everything from ES6 to ES2020.
이 기사에서는 CodeWars의 제빵사 피트 챌린지를 함께 해결할 것입니다. 여기link에서 찾을 수 있습니다. 이번 챌린지 난이도는 중입니다.
함께 작업을 읽어 봅시다.
Pete likes to bake some cakes. He has some recipes and ingredients. Unfortunately, he is not good at maths. Can you help him to find out, how many cakes he could bake considering his recipes?
Write a function cakes(), which takes the recipe (object) and the available ingredients (also an object) and returns the maximum number of cakes Pete can bake (integer). For simplicity, there are no units for the amounts (e.g. 1 lb of flour or 200 g of sugar are simply 1 or 200). Ingredients that are not present in the objects, can be considered as 0.Examples:
// must return 2
cakes({flour: 500, sugar: 200, eggs: 1}, {flour: 1200, sugar: 1200, eggs: 5, milk: 200});
// must return 0
cakes({apples: 3, flour: 300, sugar: 150, milk: 100, oil: 100}, {sugar: 500, flour: 2000, milk: 2000});
우리는 여러 방법으로 이 문제를 해결할 수 있지만 그 배후의 논리는 단순히 객체의 키를 반복하고 재료를 사용할 수 있는 케이크 수를 계산한 다음 재료에 대해 얻은 가장 낮은 수를 반환하는 것입니다.
첫 번째 방법 - For In
for..in
루프를 사용하여 해결해 봅시다.function cakes(recipe, available) {
let maxCakes;
for(var ingredient in recipe){
}
}
이것은 루프의 뼈대입니다. 보시다시피 제가 얼마나 많은 케이크를 만들 수 있는지 추적할 변수
maxCakes
를 초기화했습니다. 루프를 계속 진행해 보겠습니다.function cakes(recipe, available) {
let maxCakes;
for(var ingredient in recipe){
if(available[ingredient]){
const possibleCakes = Math.floor(available[ingredient] / recipe[ingredient] || 0);
if(!maxCakes || possibleCakes < maxCakes){
maxCakes = possibleCakes
}
} else {
return 0
}
}
return maxCakes;
}
요약하자면:
Math.floor
를 사용하여 가장 낮은 정수로 내림합니다.maxCakes
가 undefined
(우리가 만드는 첫 번째 반복임을 의미)이거나 이 성분이 우리에게 제공할 수 있는 가능한 케이크의 양이 다른 성분에 대해 계산한 양보다 적은 경우 우리는 maxCakes
의 값을 업데이트합니다. )여기 있습니다. 이것은
for..in
루프를 사용하는 간단한 솔루션입니다. reduce
방법으로 한 번 더 시도해 봅시다.두 번째 방법 - 축소
이 솔루션의 논리는 이전과 동일합니다. 구문은 처음에는 읽기가 다소 어렵지만 더 간결할 수 있습니다.
function cakes(recipe, available) {
return Object.keys(recipe).reduce(function(val, ingredient) {
console.log(val);
console.log(ingredient);
return Infinity
}, Infinity)
}
cakes(
{"flour":500,"sugar":200,"eggs":1},
{"flour":1200,"sugar":1200,"eggs":5,"milk":200}
)
이 구현에서 우리는 레시피
reduce
의 키Array
에서 Object
를 호출하고 Infinity
를 첫 번째 값으로 전달합니다. 우리는 재료의 최대 값이 무엇인지 모르기 때문에 안전하게 플레이하고 대신 사용해야 합니다.위의 코드를 실행하면 다음과 같은 결과가 표시됩니다.
Infinity
flour
Infinity
sugar
Infinity
eggs
우리는
Infinity
를 반환하고 싶지 않습니다. 우리가 원하는 것은 만들 수 있는 가능한 가장 적은 수의 케이크를 반환하는 것입니다. 그렇게 하기 위해 함수를 다음과 같이 변경할 수 있습니다.function cakes(recipe, available) {
return Object.keys(recipe).reduce(function(val, ingredient) {
return Math.min(Math.floor(available[ingredient] / recipe[ingredient] || 0), val)
}, Infinity)
}
cakes(
{"flour":500,"sugar":200,"eggs":1},
{"flour":1200,"sugar":1200,"eggs":5,"milk":200}
)
우리가 변경한 내용은 다음과 같습니다.
return Math.min(Math.floor(available[ingredient] / recipe[ingredient] || 0), val)
이것이 하는 일은 이 현재 재료로 만들 수 있는 현재 케이크 수(
Math.min
) 또는 Math.floor(available[ingredient] / recipe[ingredient] || 0
변수를 통해 전달하는 이전 반복에서 반환된 값 사이의 최소값( val
)을 가져오는 것입니다.첫 번째 반복에서
val
는 Infinity
이므로 양수 값이든 0이든 상관없이 모든 값이 이 값을 재정의합니다.우리가 채택한 첫 번째 솔루션과 동일한 기능을 수행하는 더 간결한 기능이 있습니다.
이 문제를 해결하는 다른 많은 방법이 있습니다. 의견에 귀하의 방법을 알려주십시오.
이러한 유형의 콘텐츠가 마음에 드셨다면 댓글로 알려주시면 더 많은 콘텐츠를 만들겠습니다.
ES6에서 ES2020까지 JavaScript에 대한 모든 것을 배우고 싶다면 Github에서 무료로 읽을 수 있는 제 책을 확인하세요. 과정도 진행 중입니다 Educative.
Reference
이 문제에 관하여(자바스크립트 챌린지 5: 제빵사 피트), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/albertomontalesi/javascript-challenge-5-pete-the-baker-26o3텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)