본문 바로가기

알고리즘

JS | 일곱 난쟁이 찾아내기

❓ 일곱명이었던 난쟁이가 아홉명이 됐다.

백설공주는 일곱명의 난쟁이들을 찾아야한다.

일곱난쟁이는 키의 합이 100이 된다.

아홉난쟁이의 키가 주어졌을 때, 일곱난쟁이를 찾는 프로그램을 작성 하시오.

 

이건 주어진 난쟁이의 키를 2개씩 뽑아서

확인하는 방식으로 프로그램을 작성하면 된다.

[i] , [j]로 이중 for문을 돌면서 가짜 난쟁이를 찾을 것이다.

 

우선, 아홉개의 키를 sum에 다 더해서

두개씩을 뽑아서 그 두 개를 더한 후

모두 더한 sum값에 빼보는 것이다.

이때, 100이 나온다면 뽑은 두 개가 가짜 난쟁이가 되는 것!

 

 

이제 코드로 정리를 해 볼 것이다.

 

        function solution(arr) {
            let answer=arr;
            });

            return answer;
        }
        
        arr = [20, 7, 23, 19, 10, 15, 25, 8, 13];
        console.log(solution(arr));

먼저 이렇게 let answer=arr; 통해서

얕은 복사를 해준다.

얕은 복사는 answer도 arr도 밑에 배열을 가리키고 있는 것이다.

 

만약 arr를 수정해서 무언가를 바꾸면 answer도 똑같이 바뀌는것이다.

왜냐하면 같은 것을 가리키고 있기 때문이다.

 

 

        function solution(arr) {
            let answer=arr;
            let sum=arr.reduce((a,b)=>a+b,0);
            
            return answer;
        }
        
        arr = [20, 7, 23, 19, 10, 15, 25, 8, 13];
        console.log(solution(arr));

먼저 배열의 총 합을 먼저 구할것이다.

sum변수를 만들고 arr에 reduce를 해줘서

누적 더하기를 적용한다.

a는 누적되는 곳, b는 배열 원소이다.

 

((a,b)=>a+b,0) 여기에서 0은 맨 처음 초기값을 말한다.

굳이 0을 쓰지 않아도 자동으로 처음 값이 들어가서 상관없긴하다.

(초기값이 0이 아닌 다른 수를 넣어야할때는 작성해야함)

 

 

        function solution(arr) {
            let answer=arr;
            let sum=arr.reduce((a,b)=>a+b,0);
            for(let i=0; i<8; i++)

            return answer;
        }

        arr = [20, 7, 23, 19, 10, 15, 25, 8, 13];
        console.log(solution(arr));

for문을 작성해주는데,

i의 변수를 만들고 i는 0번 인덱스부터 돌게 만든다. i=0;

그리고 맨 끝에 8, 13은 얘네끼리 합해서 도출해도 되니까

인덱스 7번까지 돌아도 된다.

때문에 i<8; 로 해줘서 7번 인덱스까지 돌게 만드는 것이다.

 

 

        function solution(arr) {
            let answer=arr;
            let sum=arr.reduce((a,b)=>a+b,0);
            for(let i=0; i<8; i++){
                for(let j=i+1; j<9; j++){
                }
            }
            return answer;
        }

        arr = [20, 7, 23, 19, 10, 15, 25, 8, 13];
        console.log(solution(arr));

j의 for문도 만들어준다.

j는 i의 다음부터 해주는것으로 하고 j=i+1;

j는 인덱스 9번전까지 돌게 만들어 준다.

 

 

        function solution(arr) {
            let answer=arr;
            let sum=arr.reduce((a,b)=>a+b,0);
            for(let i=0; i<8; i++){
                for(let j=i+1; j<9; j++){
                    console.log(arr[i], arr[j]);
                }
            }
            return answer;
        }

        arr = [20, 7, 23, 19, 10, 15, 25, 8, 13];
        console.log(solution(arr));

이것을 콘솔로그에 출력해보면,

 

이런식으로 두개씩 짝지어서 출력이 된다.

 

 

        function solution(arr) {
            let answer=arr;
            let sum=arr.reduce((a,b)=>a+b,0);
            for(let i=0; i<8; i++){
                for(let j=i+1; j<9; j++){
                    if((sum-(arr[i]+arr[j]))===100){
                        arr.splice(i, 1);
                        arr.splice(j, 1);
                    }
                }
            }
            return answer;
        }

        arr = [20, 7, 23, 19, 10, 15, 25, 8, 13];
        console.log(solution(arr));

그럼 이제 모든 배열 총 합에서

i와 j를 더한 값을 빼줘서 100이나오면

그 값을 제거하면 된다.

 

if문을 사용해서 sum에서 arr[i]+arr[j]를 빼줬을때

===100이면 

제거하는 splice를 사용해서

배열 제거를 해준다.

 

이 상태에서 콘솔로그를 보면,

15와 25를 지워야하는데 15는 잘 지웠는데

엉뚱하게 8이 지워진 것을 볼 수 있다.

 

이유는

arr.splice(i, 1);

arr.splice(j, 1);

여기에서

i의 인덱스 번호는 5번이고 j는 6이다.

여기서 i가 지워지는 순간,

뒤에 요소들이 땡겨지면서 25가 인덱스번호5번이 되고

8번이 6번이 된다.

 

그래서 6번인 인덱스를 지우려고보니

8이 있어서 j, 1은 8을 지워버린 것이다.

 

 

        function solution(arr) {
            let answer=arr;
            let sum=arr.reduce((a,b)=>a+b,0);
            for(let i=0; i<8; i++){
                for(let j=i+1; j<9; j++){
                    if((sum-(arr[i]+arr[j]))===100){
                        arr.splice(j, 1);
                        arr.splice(i, 1);
                    }
                }
            }
            return answer;
        }

        arr = [20, 7, 23, 19, 10, 15, 25, 8, 13];
        console.log(solution(arr));

해결책은 이렇게 j를 먼저 지우면 된다.

 

 

그럼 이렇게 15,25가 제대로 지워진다.

 

 

'알고리즘' 카테고리의 다른 글

JS | 문자 찾기  (0) 2021.09.02
JS | A를 #으로 바꾸기  (0) 2021.08.31
JS | 10부제 위반 차량 출력하기  (0) 2021.08.23
JS | 홀수값 구해서 더하기 / 홀수 중 최솟값  (0) 2021.08.19
JS | 최솟값 구하기  (0) 2021.08.18