본문 바로가기

Algorithm

11279 최대 힙 / 우선순위 큐

 

우선순위 큐

  • 우선순위가 가장 높은 요소가 가장 먼저 제거됨

힙 -> 우선순위 큐를  구현하기 위한 자료구조 

  • 완전이진트리로서, 최솟값이나 최댓값을 빠르게 찾기 위해 만들어진 자료구조, 반정렬 상태 유지(부모노드값이 자식 노드의 값보다 크거나 작은 상태를 유지)
    • 최소 힙 : 부모 노드 값이 자식 노드 값보다 작거나 같음
    • 최대 힙 : 부모 노드 값이 자식 노드 값보다 크거나 같음
  • 인덱스
    • 부모 : 자식 노드 값 / 2
    • 왼쪽 자식 : 부모 노드 값 * 2
    • 오른쪽자식 : 부모 노드 값 *2 + 1
  • 삽입 : 가장 마지막 노드에 삽입한 후, 부모 노드와 비교하여 교환
  • 삭제 : 가장 크거나 작은 노드이기 때문에 루트 삭제 후, 가장 마지막에 있는 노드를 루트로 올린 후에 자식들과 교환

 

class MaxHeap:
    def __init__(self):
        self.heap = []

    def push(self, value):
        self.heap.append(value)
        self._heapify_up(len(self.heap) - 1)

    def _heapify_up(self, index):
        parent = (index - 1) // 2 #오른쪽 자식의 경우는 -1을 해주고 2를 나눠줘야 부모가 올바르게 나오므로 1뺌
        if index > 0 and self.heap[index] > self.heap[parent]:
            self.heap[index], self.heap[parent] = self.heap[parent], self.heap[index]
            self._heapify_up(parent)

    def pop(self):
        if len(self.heap) == 0:
            return 0
        if len(self.heap) == 1:
            return self.heap.pop() #힙에 1개만 있으면 바로 반환

        #1개 이상의요소가 있다면 최상단을 반환 후 가장 마지막에 있는 노드를 루트로 올리고 교환
        max_value = self.heap[0]
        self.heap[0] = self.heap.pop()
        self._heapify_down(0) #자식 노드와 비교
        return max_value

    def _heapify_down(self, index):
        leftc = index * 2 + 1 #0인덱스로 넘겨서 1씩 더해줌
        rightc = index * 2 + 2
        largest = index

        #자식이 없는 경우에는 인덱스 초과하므로 앞의 길이 조건 추가
        if leftc < len(self.heap) and self.heap[leftc] > self.heap[largest]:
            largest = leftc
        if rightc < len(self.heap) and self.heap[rightc] > self.heap[largest]:
            largest = rightc

        #루트 노드가 자식노드와 변경되었다면 교환
        if index != largest:
            self.heap[index], self.heap[largest] = self.heap[largest], self.heap[index]
            self._heapify_down(largest)

heap = MaxHeap()
n = int(input())
input_list = []

for _ in range(n):
    input_list.append(int(input()))

for i in input_list:
    if i == 0:
        print(heap.pop())
    else:
        heap.push(i)

'Algorithm' 카테고리의 다른 글

자바 알고리즘 연습(4)  (0) 2025.01.06
1927 최소 힙 / 우선순위 큐  (0) 2025.01.06
자바 알고리즘 연습(3)  (0) 2025.01.03
7568 덩치 / 브루트포스  (0) 2025.01.03
자바 알고리즘 연습(2)  (0) 2025.01.02