코딩테스트 by JS

JavaScript <일곱난쟁이>

mickey7 2023. 3. 12. 11:58

수학적 직관력을 가지고 있던 백설공주..?


풀이 성공!

<html>
    <head>
        <meta charset="UTF-8">
        <title>출력결과</title>
    </head>
    <body>
        <script>
            function solution(arr){
               let sum = 0; //초기값 안주면 NaN에러 발생.
               for(let x of arr){
                sum += x;
               }
               
               if(sum != 100){
                let want = sum - 100;
                //console.log(want);
                for(let i=0; i<arr.length; i++){
                let first; 
                let second;
                first = arr[i];
                for(let j = i+1; j<arr.length; j++){
                    second = arr[j];
                    if(arr[i]+arr[j] == want){
                        //console.log(want)
                        //console.log(arr[i])
                        //console.log(arr[j])
                        //console.log(arr)
                        //console.log(i,j);
                        arr.splice(i,1);        //arr.splice 메소드 활용 
                        //console.log(arr);
                        arr.splice(j-1,1);        //arr.splice(i,0);을 먼저하면 원래 j가 삭제하려했던 것을 삭제 못해서..
                        //console.log(arr);
                        //console.log(sum);   
                    }
                }
               }
               }
               let answer = ""
               for(let y of arr){
                console.log(y)
                answer += y + " "
               }
                //출력값이 똑같긴 한데 배열을 일렬로 출력하는 다른 방법이 있는지 찾아보자.
                return answer;
            }
            //1차 풀이 실패 --> 해결 방법이 딱히 떠오르지 않는다.
            //2차 풀이 --> 약간의 힌트를 얻어서 풀었는데 차례차례 비교하면서 해야된다는 것에서 반복문 안에 반복문을 만들어서 풀자는 생각에 풀어봄.
            let arr=[20, 7, 23, 19, 10, 15, 25, 8, 13];
            console.log(solution(arr));
        </script>
    </body>
</html>

 

 

  • console.log로 일일이 확인하면서 풀 수 있는게 JS의 장점인 것 같다. 출력값이 중간에 어떻게 나오는지 확인했더니 풀이 가능!
  • 1차 풀이 실패 후 2차 풀이 힌트는 결국 배열 안에 있는 요소를 서로 확인하면서 풀어야 한다는 데에서 얻었다.(for문 안에 for문)
  • 합계 구할 때 초기값 안주면 NaN 발생.
  • arr.slice()메소드를 직접 활용해봤다. 첨가, 삭제 모두 가능한 메소드 
    • --> 그런데 두 개의 값을 뺄 때는 첫번째 값이 먼저 삭제되면 두 번째 값은 그만큼 보정을 해서 빼야하기 때문에 i가 j보다 무조건 작을 수밖에 없는 수라서 j-1을 활용해서 보정해봤는데 다른 방법이 없는지 확인해볼 예정.
      • --> 찾아본 결과 ! 생각을 간단하게 해보면 j>i이기때문에 arr.slice(j,1)을 먼저 한 후에 arr.slice(i,1)을 하는 방법이...!
  • 마지막 출력값에서 배열 요소를 일렬로 쫙 펼치고 싶은데 생각이 나지 않아서..
  • 얕은복사 활용하는 방법도 있는데.. 얕은복사 , 깊은 복사 개념은 처음 들어봤는데 참조 방식의 차이인가? 찾아볼 예정!