JS 알고리즘 문제풀이/섹션 1. 기본문제 풀이

8.일곱난쟁이

crab. 2022. 1. 11. 15:48

📌강의 정리

가짜 난쟁이 두개를 제외시키고 출력하자

9개의 숫자중 2개의 숫자를 빼서 가짜인지 확인해보는 과정을 반복한다.

이중 for문이 돌아야한다.

i와 j가 가짜인지 확인하자

9명의 총합을 sum이라고 구해놓고 arr[i]와 arr[j]값을 더한후

그값을 sum에서 빼면 그 값이 가짜난쟁이이다.

splice를 쓰자.

얕은 복사를 해서 arr값을 복사해두자.

얕은복사는 answer = arr인데 arr값이 바뀌면 answer값도 바뀐다.

let sum=arr.reduce((a,b)=>a+b,0); 를 써서 sum을 우선 다 더한값으로 넣는다.

이중 포문에서 처음에는 i=0 그 다음에는 j=i+1로 한다.

i뒷편부터 구해야 하기 때문이다. 적절히 콘솔을 넣어서 부분적으로 계속 디버깅하자 console.log(arr[i], arr[j]) 이중포문 다음에 if문을 써서 100으로 맞춰보면 된다.

주의할점은 splice하는 순간 배열의 구성이 달라진다.

그러므로 뒤에 것을 제거하고 그 다음 앞의것을 제거한다. j → i 순서

📌느낀점

처음으로 시간내에 풀지 못한 알고리즘 문제였다.

좀 더 쉽게 풀 수 있는 아이디어가 있었는데 바로 총값을 먼저 구해놓고

다른 난쟁이둘을 더해서 빼는 것이었다.

나는 이중반복문까지는 맞췄지만 매순간 둘을 빼고 다 더하는 것으로 했고

거기서 살짝의 오류가 있었던것같다.

또한 저렇게 하기위해서 반복문 사이사이 배열의 원본을 백업하고 다시 돌아가는 방법을 택했는데

우선 이 부분에서 얕은복사를해서 나의 추측과 다르게 진행되었다.

또한 조금만 더 생각해보면 어차피 모든 배열을 다 돌아야 하며 그럴때는 i=0,i++ → j=i+1,j++ 로 반복문을 돌리면 다 돌아가는 것이다. 이번에 크게 느낀건 알고리즘을 짤때 무턱대고 실행하지말고 최대한 간단하게 할 수 있게 계속 생각을 해야한다는 점이다.

알고나면 왜 그랬나 싶다..

다시 푸니 splice를 잘써야겠다는 생각이 든다.

splice는 매개변수가 2개를 받고 처음값은 주소 두번째값은 0이면 추가 1이면 1개빼기 2이면 두개 빼기이며 세번째값부터는 추가하는 값이다.

2번 인덱스에서 한 개 요소 제거하고 "trumpet" 추가이면

var removed = myFish.splice(2, 1, 'trumpet');이고

2번 인덱스를 포함해서 이후의 모든 요소 제거 이면

var removed = myFish.splice(2); 이다

1개만 썼을때를 주의하자!

//나의 코드
<html>
    <head>
        <meta charset="UTF-8">
        <title>출력결과</title>
    </head>
    <body>
        <script>
            function solution(arr){
                let answer=[];
                let list1=arr;
                let list2=arr;
                for(let i=0; i<arr.length; i++){
                    list2 = arr;
                    list2.splice(i);
                    for(let j=0;j<list2.length;j++){
                        list1=list2;
                        list1.splice(j);
                        if((list1.reduce(function(a,b){
                            return a+b;
                        },0) === 100)){
                            answer = list1; 
                        }
                    }
                }
                return answer;
            }
            let arr=[20, 7, 23, 19, 10, 15, 25, 8, 13];
            console.log(solution(arr)); 
        </script>
    </body>
</html>
//강사님 코드
<html>
    <head>
        <meta charset="UTF-8">
        <title>출력결과</title>
    </head>
    <body>
        <script>
            function solution(arr){
                let answer=[];
                let list1=arr;
                let list2=arr;
                for(let i=0; i<arr.length; i++){
                    list2 = arr;
                    list2.splice(i);
                    for(let j=0;j<list2.length;j++){
                        list1=list2;
                        list1.splice(j);
                        if((list1.reduce(function(a,b){
                            return a+b;
                        },0) === 100)){
                            answer = list1; 
                        }
                    }
                }
                return answer;
            }
            let arr=[20, 7, 23, 19, 10, 15, 25, 8, 13];
            console.log(solution(arr)); 
        </script>
    </body>
</html>

'JS 알고리즘 문제풀이 > 섹션 1. 기본문제 풀이' 카테고리의 다른 글

10.문자 찾기  (0) 2022.01.11
9.A를 #으로  (0) 2022.01.11
7.10부제  (0) 2022.01.11
6.홀수  (0) 2022.01.11
[보충] 내장함수로 최솟값, 최댓값 구하기  (0) 2022.01.11