인프런 커뮤니티 질문&답변

프론트취준님의 프로필 이미지
프론트취준

작성한 질문수

자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)

8. 일곱난쟁이 오류 수정 영상

섹션1-8 일곱난쟁이 문제 질문

작성

·

546

·

수정됨

0

안녕하세요. 강의 코드와 결과가 이해가 되지 않아 질문드립니다.

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

중첩 for문 중에서 내부에서 조건문을 사용해서 참일 경우 배열에 splice를 통해 요소를 제거를 해주는 코드에서 의문이 생겼습니다.

  1. 중첩 for문이기 때문에 외부 for문에서 i=0 으로 시작하여 내부 for문으로 이동

  2. j=i+1 이므로 배열의 0번째 인덱스 요소를 기준으로 1번째 인덱스 요소부터 j<9 요소까지 탐색

  3. 탐색 중 if (sum - (arr[i] + arr[j]) === 100) 조건에 참인 요소가 있다면 splice 메서드를 통해 제거, j<9 요소까지 탐색을 마쳤다면 내부 for문 종료

  4. 다시 외부 for문으로 이동하여 i=1 로 증감 후 다시 내부 for문 실행..

저는 이와 같은 절차를 가진다고 생각하는데요, 3번 절차에서 조건에 참인 요소가 있다면 splice 메서드를 통해 제거가 되므로 21과 19가 제거 되는것은 이해가 되는데 왜 15와 25까지 함께 제거가 되는지 의문입니다! 21과 19가 제거된 상태라면 (sum - (arr[i] + arr[j]) === 100) 조건에 참일 수가 없을 거 같아서요.

결론은 중첩 for문인데 21과 19 그리고 15와 25까지 함께 제거가 되는지 의문입니다!

감사합니다.

답변 4

1

김태원님의 프로필 이미지
김태원
지식공유자

안녕하세요^^

21, 19를 제거한 후에도 sum값은 처음에 구한 140을 계속 유지하기 때문입니다.

1

안녕하세요, 인프런 AI 인턴이에요.

이 문제는 문제 조건에 따라 9명의 난쟁이 중에서 일곱 명의 키의 합이 100이 되는 경우를 찾는 문제입니다.

제가 예상하건데, 15와 25가 함께 제거되는 것은 21과 19가 이미 제거된 상태이기 때문입니다. 중첩된 for문을 사용할 때, 내부 for문에서 splice 메소드로 요소를 제거하면 배열의 인덱스가 변경될 수 있습니다. 그래서 21과 19가 제거된 후에는 15와 25의 인덱스가 5, 6이 아니라 4, 5가 됩니다. 그렇기 때문에 15와 25도 함께 제거됩니다.

따라서, 외부 for문에서 i=3일 때 해당 조건문이 참이 되면, 21, 19, 15, 25가 모두 제거되고, 결과적으로 키의 합이 100이 되는 일곱 명의 난쟁이를 찾아낼 수 있습니다.

이해에 도움이 되었길 바라며, 추가적인 질문이 있으시면 언제든지 댓글로 문의해주세요.

0

안녕하세요 강사님 break말고 바로 return 해도 되나요?

 

function solution(arr){
    const answer = arr; // 얕은 복사(메모상에 같은 주소를 가리킴).arr이 바뀌면 answer도 바뀌는 것 처럼 보임
    const sum = answer.reduce((acc, v)=>{
        return acc + v;
    },0)

    for(let i=0; i < answer.length; i++){
        for(let j = i+1; j < answer.length; j++){

          if((sum - (answer[i]+ answer[j])) === 100){
        
            // 뒤에 인덱스부터 없애도 앞의 인덱스는 변함이 없다.
            answer.splice(j, 1);
            answer.splice(i, 1);
            // arr.splice(i, 1);
            // arr.splice(j-1, 1);
            return answer;
            }
        }
    }
}

const arr=[22, 7, 21, 19,10, 15, 25 ,8, 13];
console.log(solution(arr));
김태원님의 프로필 이미지
김태원
지식공유자

안녕하세요^^

네. return으로 해도 됩니다. 잘 하셨습니다.

0

간결하고 명확한 답변 감사합니다!!!!

한방에 이해가 됐어요!

프론트취준님의 프로필 이미지
프론트취준

작성한 질문수

질문하기