ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [알고리즘/자바스크립트] 두 객체를 비교하여 케이크 만들 수 있는 최대 횟수 구하기 (Pete, the baker)
    Algorithm 2019. 2. 24. 20:40

    -해당 문제는 codewars사이트의 level5 문제입니다. (1~8단계 중 8단계가 가장 쉬운 레벨)-



    [문제] Pete likes to bake some cakes. He has some recipes and ingredients. Unfortunately he is not good in 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});



    [해석] 재료의 수량을 파악하여 만들 수 있는 케이크의 수를 구하는 함수를 만들자. cakes()라는 함수를 만들고 첫 번째 인자로 케이크 레시피에 나온 재료 리스트를 객체로 넣어라. 두 번째 인자로는 현재 내가 보유하고 있는 재료 리스트를 객체로 넣어라. 그리고 만들 수 있는 최대 케이크의 수를 숫자로 return한다. 필요한 재료이지만 내가 보유하고 있는 재료 리스트에 없다면 케이크를 만들 수 없으므로 0을 return 해야한다.





    알고리즘 문제를 풀다보면 "나는 왜 이렇게 바보인가ㅠㅠ" 하는 자괴감이 들곤한다.

    근데 나만 그런줄 알았는데 문제 토론 페이지를 쭉 읽어보면 

    나같은 사람들이 자조섞인 목소리로 적은 댓글들이 종종 보인다.


    "어렵게 어렵게 수십줄의 코드를 적어서 겨우 통과했는데 다른 사람들 답 보니 한 두줄로 끝나있어..난 정말 멍청이야ㅠㅠ"

    이런 댓글들ㅋㅋ



    바로 내가 이 문제를 풀면서 저 느낌을 받았다..흑흑......




    일단 내가 처음 한 생각은 이렇다.


    1) 레시피 재료와 내가 가진 재료를 하나하나 비교한다.

    2) 꼭 필요한 재료인데 내가 가진 재료에 없다면 케이크를 만들 수 없으므로 0을 리턴한다.

    3) 내가 가진 재료에서 레시피에서 필요한 재료만큼 뺀다.

    4) 내가 가진 재료가 0보다 작아질때까지 계속 반복해서 뺀다.

    5) 몇 번 반복했는지 센 다음 그 수를 리턴한다.



    .......................................아...이 얼마나 1차원적인 생각이란 말인가 흑흑.......ㅠㅠㅠ

    이게 얼마나 1차원적인 단순한 방법인지는 다른 사람들 풀이를 보고나서야 알았다...ㅜㅜㅜㅜㅜㅜㅜㅜ



    일단 처음 생각한 방법으로 짠 코드는 아래와 같다.




    function cakes(recipe, available) {
    	var reKey = Object.keys(recipe)
    	var avKey = Object.keys(available)
    	var hasIngre = function () {
    		for(var v of reKey) {
    			return avKey.includes(v)
    		}
    	}
    	if(! hasIngre()) return 0
    
    	var count = 0
    	while(makeCake() !== false) {
    		makeCake ()
    	}
    	return count
    	
    	function makeCake() {
    		for(var i=0; i<reKey.length; i++) {
    			available[reKey[i]] = available[reKey[i]] - recipe[reKey[i]]
    			if(available[reKey[i]] < 0) return false
    		}
    		count++
    	}
    }


    딱 위에서 적은 그 논리 그대로 적은 코드이다.

    테스트 통과도 되었고 아무 문제없이 잘 작동한다...


    근데 다른 사람 코드를 보고 나서 깨달았다.



    아니 왜 내가 가진 재료에서 레시피 재료 수량을 계속 반복해서 빼니...

    그냥 나누기 하면 되잖아..ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ

    ;;;;;.....


    내가 1200g의 밀가루가 있는데 케이크 만드는데 500g의 밀가루가 필요하다면

    1200을 500으로 나눈 다음 나온 수를 소수점을 버리면 그게 바로 케이크 만들 수 있는 횟수가 되는거자나...ㅜㅜㅜ...................ㅜㅜㅜㅜ




    정말 심한 자괴감을 느끼며 다시 코드를 짰다...




    function cakes(recipe, available) {
    	var reKey = Object.keys(recipe)
    	var avKey = Object.keys(available)
    	var hasIngre = function () {
    		for(var v of reKey) {
    			return avKey.includes(v)
    		}
    	}
    	if(! hasIngre()) return 0
    
    	var countArr = []
    	for(var i=0; i<reKey.length; i++) {
    		countArr.push(Math.floor(available[reKey[i]] / recipe[reKey[i]]))
    	}
    	return Math.min(...countArr)
    }


    분명 이거보다도 간단하고 쉬운 방법들이 많을테지만

    일단 이 문제는 여기까지만..ㅠㅠ..

    멘탈을 부여잡고 다음 문제로 가야겠다..




    반응형

    COMMENT