[알고리즘] 일곱 난쟁이

hoonie·2021년 7월 26일
0

알고리즘

목록 보기
7/15
post-thumbnail

문제

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

▣ 입력설명
아홉 개의 줄에 걸쳐 난쟁이들의 키가 주어진다. 주어지는 키는 100을 넘지 않는 자연수이며, 아홉 난쟁이의 키는 모두 다르며, 가능한 정답이 여러 가지인 경우에는 아무거나 출력한다.

▣ 출력설명
입력된 순서대로 일곱 난쟁이의 키를 출력한다.

▣ 입력예제
20 7 23 19 10 15 25 8 13
▣ 출력예제
20 7 23 19 10 8 13


      function solution(arr) {
        let answer = arr;
        let sum = arr.reduce((a, b) => {
          return a + b;
        });

        for (let i = 0; i < arr.length; i++) {
          for (let j = i + 1; j < arr.length; j++) {
            if (sum - (arr[i] + arr[j]) === 100) {
              arr.splice(j, 1);
              arr.splice(i, 1);
            }
          }
        }
        return answer;
      }

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

설명

우선 난쟁이들의 모든 키의 합을 구한다. 그리고 특정 두개의 배열 원소의 합을 총 합에서 빼서 100이 나오면 결과값을 도출이 가능하기때문에, 이중 반복문을 돌려 해당 식을 프로그래밍을 해야한다.

즉 reduce 메서드로 모든 수의 합을 구하고, 안쪽에 있는 for문에는 돌고있는 index에 +1을 더한상태로 이중반복을 돌린다. 그럼 첫번째 반복문이 돌때 arr[i] = 20, arr[j] = 7 이렇게 될것이다.
그럼 마지막의 반복문은 arr[i]=8, arr[j]=13이 될 것이다.

결국 모든 배열 원소 합과 이렇게 모든 두개의 배월 원소 경우의수를 더했을때하고 빼줬을때 기준값은 100이 나와야하므로 sum - (arr[i] + arr[j]) === 100 이라는 조건을 준거고 해당 조건에 해당하는 인덱스 splice를 해줘 제거를 해준다.

참고로 지금 위 식에서 arr과 answer은 같은 레퍼런스를 참조하기때문에 arr에서 원소가 제거되면 똑같이 answer에도 반영되는것이다.

0개의 댓글