[알고리즘] 백설공주와 일곱 난쟁이

전현정·2021년 12월 19일

알고리즘

목록 보기
17/18

🎱 문제설명

왕비를 피해 일곱 난쟁이들과 함께 평화롭게 생활하고 있던 백설공주에게 위기가 찾아왔다. 
일과를 마치고 돌아온 난쟁이가 일곱 명이 아닌 아홉 명이었던 것이다.

아홉 명의 난쟁이는 모두 자신이 "백설 공주와 일곱 난쟁이"의 주인공이라고 주장했다. 
뛰어난 수학적 직관력을 가지고 있던 백설공주는, 다행스럽게도 일곱 난쟁이의 키의 합이 100이 됨을 기억해 냈다.

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

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

🎱 문제이해

9개의 숫자가 들어오는 배열을 받아 그중 7개의 합이 100일 경우를 리턴하는 문제이다

  • 숫자 두개를 뽑아 더한 후 전체 숫자의 합에서 두 숫자를 더한 합을 뺐을 때의 답이 100일 경우 해당 두 숫자를 배열에서 삭제 후 출력하면 된다.

  • 배열 전체의 합을 구하고 이중 for()문을 돌며 2개의 숫자를 찾아 if 조건문을 통해 숫자를 찾은 후 splice()메소드를 이용해 숫자를 지우면 된다.

🎃 여기서 오류
해당 answer 값을 알아보기 위해 consloe 창으로 arr 값을 출력해보았다.

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

  console.log(solution(arr))

  for (let i = 0; i < arr.length - 1; i++) {
    for (let j = i + 1; j < arr.length; j++) {
      
      if (sum - (arr[i] + arr[j]) === 100) {
        arr.splice(i, 1) 
        arr.splice(j, 1)
      }
    }
  }
  return answer
}
let arr = [20, 7, 23, 19, 10, 15, 25, 8, 13]

console.log(solution(arr))

정답인 15, 25의 값이 삭제 된게 아니고
15 8의 값이 배열에서 지워졌다 ..!

🧨 이유
해당 부분에서 arr.splice(i, 1) 을 통해 i의 값이 삭제 되면서 j의 배열이 당겨져버렸다. 그래서 j 인덱스=5일때 25, 인덱스=6일때 8, 인덱스=7일때 13이 되어버림.
따라서 index가 6 일 때의 element는 8 이므로 8이 삭제된다.

if (sum - (arr[i] + arr[j]) === 100) {
  arr.splice(i, 1) //i의 index = 5 일때 j의 index 값은 6
  arr.splice(j, 1) // i가 삭제 되면서 
}

🔑 해결방법
먼저 삭제할 부분은 배열의 가장 뒤에서 삭제 하고 앞의 숫자 부터 삭제해주면 된다.

🎱 최종코드

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

  console.log(solution(arr))

  for (let i = 0; i < arr.length - 1; i++) {
    for (let j = i + 1; j < arr.length; j++) {
      
      if (sum - (arr[i] + arr[j]) === 100) {
        arr.splice(j, 1) // j의 값 먼저 삭제
        arr.splice(i, 1) 
      }
    }
  }
  return answer
}
let arr = [20, 7, 23, 19, 10, 15, 25, 8, 13]
profile
꾸준하기 위해 기록하는 개발자의 개발 일기

0개의 댓글