🗃️javascript/코테 프레임 문제

1-8 일곱난쟁이(틀림)(24년 업데이트: 맞춤)

하얀성 2023. 9. 18. 14:42

<제출답안>

여러 함수 사용 및 재귀함수 사용.

입력순서대로 출력해야 되는데 그러지 못함.

function sum(arr){
  let sum = 0;
  for(let i=0; i<arr.length-2; i++){
    sum += arr[i]
  }
  return sum;
}
function change(arr){
  let tmp = arr[0];
    arr.shift();
    arr.push(tmp);
    return arr
}

function solution(arr){
  if(sum(arr) === 100){
    arr.pop();
    arr.pop();
    return arr;
  }else{
    let changedArr = change(arr)
    return solution(changedArr);
  }
}

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

 


<답안>

sum은 늘 100인 점을 이용해서 순서대로 이중 for문을 돌면서 sum - 두 수의 합 === 100을 만족하도록 함.

두 수 중에서 j를 먼저 뽑아내야 한다. j가 뒤에 있는 수이기 때문에.

그리고 flag 를 통해서 이중 for문을 탈출한다.(break 두번씀)

function solution(arr){
  let answer=arr;
  let sum=answer.reduce((a, b)=>a+b, 0);
  let flag = 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);
              flag = 1;
              break;
          }
      }
      if(flag == 1) break;
  }
  return answer;
}

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

24.4.10 업데이트.

 

풀긴 풀었는데 j=i+1했다가 가독성이 나한테는 떨어져서 바꿨는데

i+1을 해야 같은 인덱스끼리의 반복을 막을 수 있음.

다행히 합에서 100을 뺀 값에서의 두 조합을 구한다는 생각을 해낸게 핵심인듯하다.

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

  for (let i = 0; i < arr.length; i++) {
    for (let j = 1; j < arr.length; j++) {
      if (arr[i] + arr[j] === sum - 100) {
        answer = arr.filter((x) => x !== arr[i] && x !== arr[j]);
        return answer;
      }
    }
  }
}
let arr = [22, 7, 21, 19, 10, 15, 25, 8, 13];
console.log(solution(arr));