ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • reduce함수로 합을 구하고 이중 for문으로 난쟁이 구하기
    JS 알고리즘 2023. 10. 2. 22:56
    왕비를 피해 일곱 난쟁이들과 함께 평화롭게 생활하고 있던 백설공주에게 위기가 찾아왔다. 일과를 마치고 돌아온 난쟁이가 일곱 명이 아닌 아홉 명이었던 것이다. 아홉 명의 난쟁이는 모두 자신이 "백설 공주와 일곱 난쟁이"의 주인공이라고 주장했다. 뛰어난 수학적 직관력을 가지고 있던 백설공주는, 다행스럽게도 일곱 난쟁이의 키의 합이 100이 됨을 기억해 냈다. 아홉 난쟁이의 키가 주어졌을 때, 백설공주를 도와 일곱 난쟁이를 찾는 프로그램을 작성하시 오.

     

    나의 문제풀이

    문제를 보았을 때 7명이 100이 되는 수를 구하면 되는 걸 생각해 내었다. 

    20 7 23 19 10 15 25 8 13이라는 9가지의 숫자가 주어졌을때. 우선 9명을 전부 다 더해보자.

    그러면 140이라는 결과가 나온다. 

     

    그렇다면 가짜 난쟁이 두명은 합쳐서 40이라는 숫자가 나오면 된다. 

     

    그러면 각각 40이 나오는걸 하나씩 더해보면서 구해보자.

    나는 조금빠르게 15와 25라는 숫자를 더해서 40을 만들어보았다.

    하지만 컴퓨터한테 찾으라고 시키면 못 찾아서 하나의 규칙을 만들어줘야 한다. 

    예시 ) 20 + 7 = 27,  20 + 23 = 43, 20 + 19 = 39 

    이런 식으로 첫 번째 자리를 마지막까지 하나하나 다 더해보면 정답이 나올 것 같다.

     

    이걸 코드로 구현해봐야겠다.

     

    문제풀이 1 : reduce함수로 합을 구하고 이중 for문으로 구해보았다. 

    const dwarf = (height) =>{
        const sum = height.reduce((a,b)=> a+b, 0) // 140
        let realDwarf = height
        for(let i = 0; i <= height.length ; i++){
            for (let j = i+1; j<=height.length ; j++){
                if(sum - (height[i]+height[j]) == 100){
                	realDwarf.splice(i, 1)
                    realDwarf.splice(j-1, 1) // 또는 j를 먼저 앞으로 i가 앞쪽이라서 index가 바뀐다.
                }   
            }
        }
        return realDwarf
    }
    
    const height = [20, 7, 23, 19, 10, 15, 25, 8, 13]
    dwarf(height)

    그런데 약간 궁금한 점이 splice부분을 filter로 대체가능 할 것 같다. 

    const dwarf = (height) =>{
        const sum = height.reduce((a,b)=> a+b, 0) // 140
        let realDwarf = height
        for(let i = 0; i <= height.length ; i++){
            for (let j = i+1; j<=height.length ; j++){
                if(sum - (height[i]+height[j]) == 100){
                    const realDwarf = height.filter((_,index) => index !== i && index !== j)
                }   
            }
        }
        return realDwarf
    }
    
    const height = [20, 7, 23, 19, 10, 15, 25, 8, 13]
    dwarf(height)

    그래서 대체해본 결과 filter 함수 공부하는데 큰 도움이 되었다. 

    우선 filter는 (요소, 인덱스) 이렇게 두 개를 받아올 수 있다. 

     

    그런데 여기서 _(언더바)를 사용하게 되면 관습적으로 사용하지 않음을 명시해 주는 것이라고 한다.

     

    그리고 index !== i로 비교한 이유는 scope(범위) 문제인데 정확한 건 조금 더 filter에 대해서 공부를 해보아야 할 것 같다.

     


     

leechi's blog