일곱난쟁이

아기코딩단2·2022년 7월 25일
0

일곱 난쟁이
왕비를 피해 일곱 난쟁이들과 함께 평화롭게 생활하고 있던 백설공주에게 위기가 찾아왔다.
일과를 마치고 돌아온 난쟁이가 일곱 명이 아닌 아홉 명이었던 것이다.
아홉 명의 난쟁이는 모두 자신이 "백설 공주와 일곱 난쟁이"의 주인공이라고 주장했다. 뛰어난
수학적 직관력을 가지고 있던 백설공주는, 다행스럽게도 일곱 난쟁이의 키의 합이 100이 됨을
기억해 냈다.
아홉 난쟁이의 키가 주어졌을 때, 백설공주를 도와 일곱 난쟁이를 찾는 프로그램을 작성하시
오.
▣ 입력설명
아홉 개의 줄에 걸쳐 난쟁이들의 키가 주어진다. 주어지는 키는 100을 넘지 않는 자연수이며,
아홉 난쟁이의 키는 모두 다르며, 가능한 정답이 여러 가지인 경우에는 아무거나 출력한다.
▣ 출력설명
입력된 순서대로 일곱 난쟁이의 키를 출력한다.
▣ 입력예제 1
20 7 23 19 10 15 25 8 13
▣ 출력예제 1
20 7 23 19 10 8 13

<!--my worng solution-->
<html>
    <head>
        <meta charset="UTF-8">
        <title>출력결과 - 섹션1-8 - 일곱난쟁이</title>
    </head>
    <body>
        <script>
            function solution(arr) {
                const correct = 100;
          // 일곱난쟁이들은 총 키의 합이 100이된다;
                let nines = 0;
                for (element of arr) {
                    nines = nines + element;
          	// 그러나 주어지는 난쟁이의 수는 9명 전부 더해서 correct 를 빼준다
          // 그러면 아홉난쟁이중 거짓말을 치는 2명의 난쟁이가 나올 것이다.
                }
                
                lier = nines - correct; 
          // 두명의 난쟁이의 키의 합 
                // console.log(lier);
			
          //이중 for문을 이용해서 배열의 i번째 들의 합이 두명의 난쟁이 키의 합이 되면 
          //배열에서 pop해서 빼주도록 했다.
          // 가능한 정답이 여러 가지인 경우에는 아무거나 출력한다. <== 문제중 이부분을 잊으면 안된다.
                for (let i = 0; i < arr.length; i++) { 
                    for (let j = i; j < arr.length; j ++) {
                        if (lier === (arr[i] + arr[j])) {
                            let one = arr[i];
                            let two = arr[j];
                            arr.pop(one);
                            arr.pop(two);
                            console.log('거짓말쟁이 1번:::', arr[i], '거짓말쟁이 2번:::', arr[j]);
                            return arr;
                        }
                    } 
                } 
            }
            const littles = [15, 10, 25, 11, 8, 10, 21, 10, 15];

            console.log(solution(littles));
        </script>
    </body>
</html>

잘 나온다. 뭔가 내가 그 상황속에 처해있다고 생각하니 잘풀렸다ㄷㄷㄷ 내가 백설공주라면!?!?!? 이렇게 생각하면서 풀었음ㅎㅎ;;

사실 위에있는 풀이는 틀렸다;; 검산을 하나밖에 안해봤다;

===> 틀린 부분이다.
const littles = [20, 7, 23, 19, 10, 15, 25, 8, 13];
이렇게 넣었을 때

거짓말쟁이들은 잘 나왔다 그러나 배열이 당겨지면서 인덱스가 계산이 잘못됐다. 그래서 최종 7난쟁이들 중에 8과 13이 없는 것이다.

<!--correct my sloution-->

<html>
    <head>
        <meta charset="UTF-8">
        <title>출력결과 - 섹션1-8 - 일곱난쟁이</title>
    </head>
    <body>
        <script>
            function solution(arr) {
                const correct = 100;
                let nines = 0;
                for (element of arr) {
                    nines = nines + element;
                }
                
                lier = nines - correct;
                // console.log(lier);

                for (let i = 0; i < arr.length; i++) { 
                    for (let j = i + 1; j < arr.length; j ++) {
                        if (lier === (arr[i] + arr[j])) {
                            // let one = arr[i];
                            // let two = arr[j];
                            let one = arr.splice(j, 1);
                            let two = arr.splice(i, 1);
                            console.log('거짓말쟁이 1번:::', one, '거짓말쟁이 2번:::', two);
                            return arr;
                        }
                    } 
                } 
            }
            const littles = [20, 7, 23, 19, 10, 15, 25, 8, 13];

            console.log(solution(littles));
        </script>
    </body>
</html>

바뀐부분은 pop 대신에 splice를 사용한 부분과 이중 for 문에서 for (let j = i + 1; 이렇게 i + 1 으로 바꾼 부분이다 왜냐하면 제일 처음 arr[0] + arr[0] 의 결과가 필요없기 때문이다. 그리고 중요한 부분은 splice 가 앞쪽부터 제거하기 때문에 배열이 당겨진다는 부분이다.(이 부분에 대해서는 좀 더 이해가 필요하다.) 그래서 뒷부분 부터 splice 를 해주면 괜찮다.

let one = arr.splice(j, 1);
let two = arr.splice(i, 1);

이런식으로 말이다.

결과는 잘 나온다.

<!--teacher's solution-->
<html>
    <head>
        <meta charset="UTF-8">
        <title>출력결과</title>
    </head>
    <body>
        <script>
            function solution(arr){
                let answer=arr;
                let sum=answer.reduce((a, b)=>a+b, 0);
                for(let i=0; i<8; i++){
                    for(let j=i+1; j<9; j++){
                        if((sum-(answer[i]+answer[j]))==100){
                            answer.splice(j, 1);
                            answer.splice(i, 1);
                        }
                    }
                }
                return answer;
            }
            
            let arr=[20, 7, 23, 19, 10, 15, 25, 8, 13];
            console.log(solution(arr));
        </script>
    </body>
</html>

어,,,음,,, 선생님은 reduce라는 함수를 사용했다. 그리고 pop해서 빼내지 않고 splice를 사용했다. 강의를 한 번 들어봐야겠다.
공통점은 이중 for문을 돌리고 제어문을 사용한 부분이다.

profile
레거시 학살자

0개의 댓글