본문 바로가기

개발 공부

Heap

 

Heap

Heap은 특정 기준에 따라 항상 정렬 상태를 유지하는 트리 기반 자료구조입니다.

 

 

Heap은 아래 조건만 보장합니다.

MinHeap

  • 부모 ≤ 자식
  • 가장 작은 값이 항상 맨 위(root)

MaxHeap

  • 부모 ≥ 자식
  • 가장 큰 값이 항상 맨 위(root)

그래서 Heap은 이렇게 쓰입니다.

상황 이유
가장 작은 값 / 큰 값 빠르게 꺼내기 O(1)
삽입 / 삭제 O(log n)
정렬 없이 Top K 유지 효율적

 


PriorityQueue = Heap

자바스크립트 / 타입스크립트에서 흔히 쓰는 MinPriorityQueue 는 MinHeap 구현체입니다.

const minHeap = new MinPriorityQueue<number>();

여기서 중요한 메서드 3개

minHeap.enqueue(value); // 삽입
minHeap.dequeue();      // 최우선 값 제거
minHeap.front();        // 최우선 값 조회

 

minHeap.front();
  • "먼저 들어온 값"이 아닙니다
  • 우선순위 기준으로 가장 앞에 있는 값 = 가장 작은 값
minHeap.enqueue(5);
minHeap.enqueue(1);
minHeap.enqueue(10);
minHeap.enqueue(3);

minHeap.front(); // 1
  • 입력 순서와 무관하게 최소값이 나옵니다.

 


Heap으로 k번째 큰 수 구하기

대표적인 Heap 활용 문제입니다.

문제 요약

  • 배열 nums
  • k번째로 큰 수 반환
  • 크기 k짜리 MinHeap 유지
  • Heap에는 항상 상위 k개 값만 존재
  • Heap의 최소값 = k번째로 큰 값
function findKthLargest(nums: number[], k: number): number {
  const minHeap = new MinPriorityQueue<number>();

  for (const num of nums) {
    if (minHeap.size() < k) {
      minHeap.enqueue(num);
    } else if (num > minHeap.front()) {
      minHeap.enqueue(num);
      minHeap.dequeue();
    }
  }

  return minHeap.front();
}

enqueue → dequeue 순서인가?

이 두 줄은 세트입니다.

minHeap.enqueue(num);
minHeap.dequeue();

의미는 단순합니다.

새 후보를 넣고, k+1명 중 꼴찌를 탈락

예시 (k = 3)

기존 힙: [4, 7, 9]
num = 10

enqueue → [4, 7, 9, 10]
dequeue → [7, 9, 10]
  • 항상 상위 3개만 유지

'개발 공부' 카테고리의 다른 글

비트 연산  (0) 2026.01.10
DP-Dynamic Programming(동적 계획법)  (0) 2026.01.09
TreeNode  (0) 2025.12.08
연결 리스트(Node)  (0) 2025.12.06
Awaited와 ReturnType을 활용한 타입 자동 추론  (0) 2025.11.19