ONE QUESTION AT A TIME.

천천히 생각하고, 분명하게.

TODAY’S QUESTION635 / 1500
자료구조난이도 하5분 답변 목표 · 보강본

우선순위가 있는 작업을 계속 추가하면서 가장 작은 값의 작업부터 꺼내려 합니다. 힙과 정렬된 배열의 삽입·조회·삭제 비용을 어떻게 비교하나요?

잠깐, 답변을 보기 전에
먼저 내 말로 설명해 볼까요?

답변과 점검 포인트 펼치기답변 접기
01

구두 답변

정의를 외우기보다, 원리와 조건을 연결해 설명해 보세요.

가장 작은 우선순위 작업을 반복해서 꺼내면서 새 작업도 계속 들어온다면 최소 힙을 우선 선택하겠습니다. 힙은 전체 순서를 유지하지 않고 최솟값만 루트에 둔다는 약한 순서를 유지해 삽입과 최솟값 삭제를 O(log n)에 처리합니다. 정렬 배열은 전체 순서와 범위 조회에는 좋지만 새 원소를 넣을 때 뒤 원소를 이동해야 하므로 동적 삽입이 많으면 O(n)이 될 수 있습니다.

우선순위 변경과 공정성을 설계합니다

최소 힙에서는 부모가 자식보다 크지 않다는 조건만 지키므로 루트가 최솟값이라는 사실은 알 수 있지만 배열을 앞에서 읽는다고 전체가 정렬된 것은 아닙니다. 새 원소를 끝에 넣고 부모와 비교하며 위로 올리고, 루트를 꺼낼 때 마지막 원소를 루트에 둔 뒤 자식과 비교하며 내려보냅니다. 완전 이진 트리를 배열에 저장하므로 포인터가 필요 없고 최솟값 확인은 O(1), 힙 순서 복구는 O(log n)입니다. 다만 기반 동적 배열이 확장되는 삽입은 O(n) 복사가 추가될 수 있습니다. 이 부분적인 순서를 힙 순서(heap order)라고 부릅니다.

정렬 배열은 삽입 위치를 이진 탐색으로 O(log n)에 찾더라도 공간을 만들기 위한 이동이 남습니다. 최소값을 배열의 한쪽 끝에 두면 추출은 O(1)이지만 삽입은 여전히 비쌉니다. 반대로 모든 입력이 미리 준비돼 꺼내기만 한다면 한 번 정렬한 뒤 순서대로 읽는 배열이 단순하고 빠를 수 있습니다. 범위 조회, 이전·다음 원소 탐색, 전체 순서 출력이 잦다면 힙은 별도 구조 없이는 적합하지 않습니다.

변경·동점·임의 삭제를 설계합니다

힙 안의 작업 우선순위 필드를 직접 바꾸면 원래 위치에서 힙 규칙이 깨질 수 있습니다. 위치 인덱스를 함께 관리해 우선순위 변경 뒤 위·아래로 조정하거나, 새 항목을 넣고 옛 항목을 무효화하는 지연 삭제를 사용해야 합니다. 같은 우선순위의 FIFO를 보장하려면 증가하는 삽입 번호를 보조 키로 넣어 (priority, sequence)를 비교합니다. 특정 작업을 지우려면 위치 맵을 추가하거나 삭제 요청을 표시해 루트에서 건너뛰게 합니다.

저는 최솟값 추출 빈도, 임의 조회·변경, 동점 규칙, 메모리 지역성, 확장 지연을 실제 부하로 측정하겠습니다. 우선순위가 높은 일이 계속 들어와 낮은 일이 굶주리는 문제라면 자료구조만으로 해결되지 않으므로 aging이나 별도 공정성 정책도 검토합니다.

모든 작업이 미리 준비돼 꺼내기만 하면 정렬 배열이 단순할 수 있고, 범위 조회나 전체 순서가 필요하면 힙보다 정렬 인덱스가 맞습니다. 동점 FIFO에는 삽입 순번을 보조 키로 넣지만 재시작·오버플로 정책도 필요합니다. 최솟값 추출 빈도, 임의 조회·변경, 메모리 지역성, 공정성과 최대 지연을 함께 측정하겠습니다.

힙에서 우선순위의 방향을 잘못 구현하면 최소 힙과 최대 힙이 뒤집히므로 비교자 계약을 테스트의 첫 조건으로 두겠습니다. 오래된 후보를 지연 삭제하는 방식은 pop 때 현재 버전과 항목의 버전을 비교해야 하고, 버전 번호가 재사용되면 새 작업을 잘못 무효화할 수 있습니다. 정렬 배열은 삽입을 묶어 배치하거나 빈 공간을 블록 사이에 두면 이동을 줄일 수 있지만 구조가 복잡해집니다. 작업이 만료 시각까지 함께 요구한다면 힙의 정렬 키와 실행 예산을 분리해, 자료구조가 선택한 순서가 실제 처리 공정성을 자동으로 보장한다고 오해하지 않겠습니다.

기존 n개 작업을 처음 적재할 때는 하나씩 삽입하는 O(n log n) 방식보다 아래쪽 부모부터 내려보내는 heapify로 O(n)에 구성할 수 있습니다. 아래층의 많은 노드는 조금만 이동하고 긴 이동이 필요한 위층 노드는 적기 때문입니다. 단, 이 초기 구성 이점과 이후 한 건의 삽입·추출 비용은 구분해 설명하겠습니다.

02

득점 포인트

이해가 드러나는 지점을 확인해 보세요.

  • 힙의 부분 순서와 정렬 배열의 전체 순서를 구분한다.
  • 삽입·최솟값 조회·추출·임의 변경의 비용을 실제 요구와 연결한다.
  • 동점 FIFO, 우선순위 변경, 임의 삭제에서 필요한 보조 구조를 설명한다.
03

감점 포인트

놓치기 쉬운 조건과 오해를 짚어 보세요.

  • 힙 배열을 앞에서 읽으면 전체 정렬이라고 말한다.
  • 힙이 모든 값의 검색과 범위 조회도 빠르다고 단정한다.
  • 우선순위 필드를 직접 수정하고 힙 복구를 생략한다.
04

더 파고들 거리

하나 더 질문하며 이해의 범위를 넓혀 보세요.

득점·감점 포인트는 학습용 자기 점검 기준이며, 특정 회사의 실제 채점표가 아닙니다.

원리부터 공부하고 싶다면

답변을 보충하는 개념·예제·슈도코드를 읽어 보세요.

← 전체 질문 보기