SBS아카데미/게임프로그래밍

[C++ - TIL] 원형 큐와 우선순위 큐

musukie 2025. 7. 24. 21:43

📘 TIL – 2025.07.24

✅ 오늘 배운 것: 큐(Circular Queue)와 우선순위 큐(Priority Queue) 구현 및 개념 정리


🧩 1. 원형 큐(Circular Queue)

  • 정적 배열을 이용한 고정 크기 큐를 구현함.
  • FIFO (First In, First Out) 구조.
  • 배열 끝까지 데이터가 채워진 뒤, 앞부분에 빈 공간이 있어도 rear가 돌아올 수 있도록 modulo 연산 사용.
  • 한 칸을 항상 비워 두는 이유:
    • front == rear일 때 큐가 비어 있는지 가득 찬 것인지 구분 불가.
    • 이를 방지하려고 하나의 공간을 비움.

구현상 주의점

  • empty()는 front == rear로 판단.
  • peek() 시 큐가 비었을 경우 exit(1)로 종료 처리됨.
  • 배열 초기화 시 container[i] = NULL; → 정수형 배열에서는 적절하지 않음. (추후 개선 필요)

🏗️ 2. 우선순위 큐(Priority Queue)

  • 일반적인 큐와 다르게, 우선순위가 높은 요소가 먼저 나감.
  • 내부적으로 힙(Heap) 구조를 사용해 구현.
    • 오늘은 최대 힙(Max Heap) 방식으로 구현.

주요 기능

  • push(T data):
    • 데이터 삽입 후, 부모와 비교해 위로 올라가며 정렬 (Heapify-Up)
    • while (child > 0) 루프에서 부모보다 작을 경우 정렬 중단이 필요
      • break문을 안 쓰면 루프가 불필요하게 계속 돌 수 있음 (에러는 아니지만 비효율적)
  • resize(int newSize):
    • 동적 배열이 꽉 찼을 때 배열 크기를 늘림 (2배 확장)
    • 메모리 누수를 방지하기 위해 기존 배열 삭제 후 포인터 변경
    • 초기화 시 temporary[i] = NULL; → 템플릿 타입에서는 T() 사용이 안전
  • top():
    • 최댓값인 루트 노드를 반환
    • 큐가 비었을 경우 exit(1)로 종료

구현상 실수 및 개선

  • child = index - 1이 아닌 child = index를 써야 방금 삽입한 노드 기준으로 정렬됨.
  • empty() / size() 함수에서 참조(&)를 반환할 필요 없음, const를 붙이는 게 안전하고 명확.

🧠 오늘의 주요 깨달음

개념요약
원형 큐의 한 칸 비움 가득 찼는지 비었는지 구분하기 위해 한 칸 남겨둠
힙 정렬에서 break의 필요성 불필요한 루프 반복을 막고 성능 및 논리 명확성 확보
NULL vs T() 템플릿에서의 안전한 초기화는 T()로 해야 함
동적 배열 크기 조절 resize 시 메모리 관리(할당 + 해제) 중요
참조 반환의 오남용 주의 단순 값 반환은 참조보단 값 복사 + const가 적절