Algorithm/Problem Solving

[JS] 일곱 난쟁이

SH_Roh 2021. 9. 9. 11:05
반응형

문제

아홉 난쟁이 모두가 자기가 일곱 난쟁이라고 주장한다. 일곱 난쟁이의 키의 합이 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 = 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];

 

먼저 reduce를 이용해서 배열 전체의 합을 구해준다.

그리고 배열의 요소 2개의 합을 구해서 전체 합에서 그 합을 뺀 값이 100이 되는 경우를 찾는다.

찾았다면 splice를 이용해서 배열에서 제거해준다. 이 때, i를 먼저 제거하면 j의 인덱스가 줄어들기 때문에 j-1로 splice를 하거나, j를 먼저 제거하도록 한다. (이때 j=i+1이기 때문에 j<i일 경우는 고려하지 않아도 된다.)

 

 

(filter를 이용해서도 한번 풀어보았다.)

 

function solution(arr) {
  let answer;
  let sum = arr.reduce((a, b) => a + b, 0);
  for (let i = 0; i < arr.length; i++) {
    for (let j = i + 1; j < arr.length; j++) {
      if (sum - (arr[i] + arr[j]) === 100) {
        answer = arr.filter((x) => x !== arr[i] && x != arr[j]);
      }
    }
  }
  return answer;
}

let arr = [20, 7, 23, 19, 10, 15, 25, 8, 13];

 

본 문제는 아래의 인프런 자바스크립트 알고리즘 문제풀이 강의의 내용입니다. 자바스크립트로 코딩테스트를 준비중이시라면 꼭 들어보시는 것을 추천드려요!

 

자바스크립트 알고리즘 문제풀이(코딩테스트 대비) - 인프런 | 강의

자바스크립트(JavaScript)로 코딩테스트를 준비하시는 분을 위한 강좌입니다. 재미있게 풀 수 있는 기초 단계 문제부터 고급 알고리즘까지 단계별로 차근차근 배우도록 설계된 강좌입니다., 개발

www.inflearn.com

 

반응형