채널톡 아이콘

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

samkookji12님의 프로필 이미지

작성한 질문수 8

비전공자의 전공자 따라잡기 - 자료구조(with JavaScript)

heapify

heapify 안의 bigger 삼항연산자 질문

작성

·

71

0

  #heapify(index) { // 특정 값 수정, 삭제
      const leftIndex = index * 2 + 1;
      const rightIndex = index * 2 + 2;
      const bigger = (this.arr[leftIndex] || 0 )> (this.arr[rightIndex] || 0) ? leftIndex : rightIndex;
      if (this.arr[index] < this.arr[bigger]) {
        const temp = this.arr[bigger];
        this.arr[index] = this.arr[bigger];
        this.arr[bigger] = temp;
        this.#heapify(bigger);
      }
  }

 

bigger 삼항연산자에서

this.arr[leftIndex]의 값이 0 이고 this.arr[rightIndex]의 값이 undefined이면 조건이 false가 되면서 bigger에 rightIndex값이 들어가면서 오류가 생기는거 같습니다!

답변 2

0

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

let i = Math.floor(this.arr.length / 2 - 1)

조건이 있어서 this.arr[rightIndex]가 undefined가 될 일이 없지 않나요?

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다. samkookji12님.

heapify 메서드 안에서 bigger 변수를 계산할 때 삼항 연산자의 조건식에서 문제가 생길 수 있다는 점에 대해 질문 주셨네요. 문제의 핵심은 this.arr[leftIndex]this.arr[rightIndex]가 각각 0과 undefined일 때 발생하는 상황입니다. 이 경우 0은 falsy 값으로 평가되고 undefined와의 비교에서 부정확한 결과를 가져올 수 있습니다.

삼항 연산자의 조건식을 더 안전하고 명확하게 변경할 필요가 있습니다. 조건식의 각 항목에 대해 명시적인 비교를 사용하는 것이 좋습니다. 예를 들어, 다음과 같이 작성할 수 있습니다:

const bigger =
    (this.arr[leftIndex] !== undefined && (this.arr[rightIndex] === undefined || this.arr[leftIndex] > this.arr[rightIndex]))
        ? leftIndex
        : rightIndex;

위 코드에서는 우선 leftIndexrightIndex가 각각 배열의 범위를 벗어나지 않는지를 확인하고, 값을 비교합니다. 이 방법을 통해 삼항 연산자 내의 잘못된 비교로 인한 오류를 방지할 수 있습니다.

관련된 설명을 담고 있는 질문을 찾았습니다:

  • 조건문 안 플래그 값 - 이 질문에서는 조건문에서 truthy, falsy 값을 다루는 방법에 대해 설명하고 있습니다. 특정 조건의 명확한 사용이나 오류 방지 방법에 관심 있고, 모든 조건을 명시적으로 다루는 것이 허용될 때 자연스러운 경향이 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.