inflearn logo
강의

Course

Instructor

Non-majors catching up with majors - Data Structures (with JavaScript)

Implementing remove

최소힙 remove 구현하기

245

rhkdtjd124829

138 asked

0

class MinHeap {
  // 최소힙
  arr = [];

  #reheapUp(index) {
    if (index > 0) {
      const parentIndex = Math.floor((index - 1) / 2);
      if (this.arr[index] < this.arr[parentIndex]) {
        const tmp = this.arr[index];
        this.arr[index] = this.arr[parentIndex];
        this.arr[parentIndex] = tmp;

        this.#reheapUp(parentIndex);
      }
    }
  }

  insert(value) {
    const index = this.arr.length;
    this.arr[index] = value; // 마지막에 값을 넣어준다.
    this.#reheapUp(index);
  }

  #reHeapDown(index) {
    const leftIndex = index * 2 + 1; // 왼쪽 Index
    if (leftIndex < this.arr.length) {
      // 만약에 왼쪽 인덱스가 총 배열의 길이보다 작은경우
      const rightIndex = index * 2 + 2;
      const smaller =
        this.arr[leftIndex] > this.arr[rightIndex] ? leftIndex : rightIndex;
      if (this.arr[index] < this.arr[smaller]) {
        const temp = this.arr[index];
        this.arr[index] = this.arr[smaller];
        this.arr[smaller] = temp;
        this.#reHeapDown(smaller);
      }
    }
  }

  remove() {
    // root만 remove
    if (this.arr.length === 0) {
      return false;
    }

    if (this.arr.length === 1) {
      // 마지막 하나 남으면 pop해서 리턴해주기
      return this.arr.pop();
    }

    const root = this.arr[0];
    this.arr[0] = this.arr.pop();
    this.#reHeapDown(0);
    return root;
  }

  sort() {
    // 힙 정렬
    const sortedArray = [];
    while (this.arr.length > 0) {
      sortedArray.push(this.remove());
    }
    return sortedArray;
  }

  search(value) {
    for (let i = 0; i < this.arr.length; i++) {
      if (arr[i] === value) {
        return i;
      }
    }
  }
}

const minheap = new MinHeap();
minheap.insert(78);
minheap.insert(56);
minheap.insert(45);
minheap.insert(32);
minheap.insert(23);
minheap.insert(19);
minheap.insert(8);
console.log(minheap.arr);
minheap.remove();
minheap.remove();
minheap.remove();
minheap.remove();
minheap.remove();
minheap.remove();

 

최대힙 코드를 최소힙 구하기 코드로 바꿔봤습니다.

 

질문1) 최소힙 구하기 remove 코드가 맞을까요?

질문2) 최대힙이든 최소힙이든 sort 메서드가 sort 메서드 호출시 remove 메서드를 while문 루프로 호출하여서 sort 메서드 실행 후에 this.arr가 당연하게 빈배열이 되는데 while문 전에 this.arr를 변수에 담아두었다가 while 루프가 끝난후에 다시 this.arr 멤버변수에 넣어주어야 하는거 아닌가 궁금합니다.

javascript 코딩-테스트 알고리즘

Answer 1

1

zerocho

  1. 네네

  2. 네 맞습니다. 지금 강의의 구조는 1회성 정렬용 힙입니다. 재사용하려면 this.arr을 계속 가지고 있어야 합니다.

0

rhkdtjd124829

답변 감사드립니다 :)

2주차 개념#12 트리 순회

0

14

2

프론트엔드 학습 수준 문의

0

22

2

백준 사이트 서비스 종료

0

39

3

잠겨버린 사물함 시간초과 관련 질문입니다.

0

17

1

스택, 큐 연결리스트로 구현 과제 완료입니다!

0

93

1

heapify 안의 bigger 삼항연산자 질문

0

116

2

LinkedList로 스택, 큐 구현하기 숙제

0

123

1

linkedList prev와 tail 사용 후 o(1) 구현.

0

165

1

숙제 : LinkedList로 Stack, Queue 구현하기

0

177

1

연결리스트 숙제

0

239

1

한번에 이해 안가는 제가 비정상 일까요...?

0

234

1

우선순위 큐 질문이 있습니다!

0

154

1

[숙제] minHeap 구현, maxHeap -> minHeap , minHeap -> maxHeap

1

235

1

숙제 최소힙 만들기

0

152

1

숙제 length return 하기

0

194

1

숙제 : 같은 값을 넣은경우 에러 처리

0

181

1

영상 중간에 0:10 1:23초 수정에 따른 코드 최종본

1

143

1

숙제2 연결리스트를 이용하여 큐 구현하기

0

237

1

숙제1 LinkedList로 스택 구현하기

1

251

1

연결 리스트 구현 숙제 리뷰 부탁드려봅니다

1

345

2

let current = this.head 질문 있습니다!

0

251

1

퀴즈 답안

0

469

1

최소힙의 결과값과 최대힙->최소힙 결과값이 다른게 맞나요?

0

248

1

1주차 숙제에 대한 해답 코드는 따로 제공되지 않나요??

0

495

1