기본 콘텐츠로 건너뛰기

방송대 방통대 자료구조 9강 - 힙 - 요약 노트 시험족보 예상문제 - 올에이클래스

0-썸네일-요약노트-자료구조-9강

자료구조 9강 - 힙

힙은 우선순위가 가장 높은 원소를 빠르게 선택하기 위해 사용하는 완전 이진 트리 기반 자료구조이다. 이 글에서는 일반 큐와 우선순위 큐의 차이, 최소 힙과 최대 힙의 조건, 배열 표현, 루트 삭제의 하향 재구성과 노드 삽입의 상향 재구성을 차례로 학습한다.

제1장 우선순위 큐

1. 큐와 우선순위

일반적인 큐(queue)는 먼저 들어온 데이터가 먼저 삭제되는 자료구조이다. 먼저 줄을 선 사람이 먼저 서비스를 받는 것과 같은 선입선출 방식이며, 운영체제의 준비 큐에서도 먼저 도착한 작업을 먼저 처리하는 모습을 생각할 수 있다.

그러나 모든 대기 대상의 중요도가 같지는 않을 수 있다. 우선순위 큐(priority queue)는 대기 중인 원소 가운데 우선순위가 가장 높은 원소를 먼저 삭제하여 서비스하는 구조이다. 따라서 입력 순서보다 각 원소에 부여된 우선순위가 삭제 순서를 결정한다.

구분삭제 기준특징
일반 큐가장 먼저 들어온 원소입력 순서에 따라 서비스한다.
우선순위 큐우선순위가 가장 높은 원소입력 순서와 실제 삭제 순서가 다를 수 있다.

2. 배열을 이용한 우선순위 큐

강의록은 배열에 1, 5, 4, 2, 6이 저장된 예를 통해 우선순위 큐의 동작을 설명한다. 여기서는 작은 값일수록 우선순위가 높다고 본다. 삭제 명령이 실행되면 가장 작은 값 1이 삭제되고, 남은 데이터 중 가장 작은 값 2가 다음 삭제 위치인 front 쪽으로 이동한다.

새 데이터 3이나 1을 삽입할 때는 우선 배열의 뒤쪽인 rear에 추가할 수 있다. 저장된 나머지 데이터의 전체 순서는 중요하지 않고, 삭제할 때 가장 우선순위가 높은 값을 찾아 먼저 꺼낼 수 있으면 된다.

우선순위 큐의 작동 원칙: 삭제할 때 저장된 데이터 중 우선순위가 가장 높은 값이 먼저 삭제된다. 그 밖의 원소들이 완전히 정렬되어 있을 필요는 없다.

배열에서 매번 가장 작은 값을 찾고 위치를 조정하는 방식도 가능하지만, 원소가 많아질수록 우선순위가 높은 원소를 효율적으로 관리할 구조가 필요하다. 이를 위한 대표적인 자료구조가 힙이다.

제2장 힙 추상 자료형

1. 힙의 정의

힙(heap)은 피라미드 모양으로 쌓아 올린 더미처럼 위에서 아래로 계층을 이루는 자료구조이다. 자료구조의 관점에서는 부모 노드와 자식 노드 사이에 일정한 우선순위 관계를 정의해 구성한 완전 이진 트리이다. 힙의 루트에는 전체 원소 중 우선순위가 가장 높은 원소가 놓인다.

힙은 완전 이진 트리의 모양을 유지하면서 부모와 자식 사이의 대소 관계, 즉 힙 순서 조건을 만족해야 한다. 트리의 모양만 완전 이진 트리이거나 부모·자식 대소 관계만 만족하는 경우에는 올바른 힙이 아니다.

힙의 두 조건: 완전 이진 트리의 구조를 유지하고, 모든 부모·자식 쌍이 해당 힙의 우선순위 조건을 만족해야 한다.

2. 힙 추상 자료형의 연산

연산기능
insert(element)힙에 데이터를 삽입한다.
delete()힙의 루트에 있는 데이터를 삭제해 반환한다.
peek()삭제하지 않고 루트의 데이터를 읽는다.
isEmpty()힙이 비어 있는지 확인한다.
size()힙에 저장된 데이터 개수를 확인한다.

deletepeek는 모두 루트를 대상으로 하지만, delete는 원소를 제거하고 힙을 재구성하는 반면 peek는 구조를 바꾸지 않는다는 점이 다르다.

제3장 최소 힙과 최대 힙

1. 최소 힙

최소 힙(min heap)은 루트가 전체 노드 중 최솟값인 힙이다. 모든 부모 노드는 자식 노드보다 작은 값을 갖는다. 이 관계가 트리 전체에서 성립하므로 루트만 확인하면 가장 작은 값을 즉시 알 수 있다.

  • 루트는 전체 원소 중 가장 작은 값을 갖는다.
  • 각 부모 노드의 값은 그 자식 노드의 값보다 작다.
  • 트리의 레벨에 따라 전체 데이터가 정렬되어 있을 필요는 없다.
  • 완전 이진 트리이므로 마지막 레벨은 왼쪽부터 채워진다.

예를 들어 루트 1의 자식이 8과 2이고, 8의 자식이 11과 9, 2의 자식이 5라면 모든 부모가 자식보다 작으므로 최소 힙 조건을 만족한다.

2. 최대 힙

최대 힙(max heap)은 루트가 전체 노드 중 최댓값인 힙이다. 모든 부모 노드는 자식 노드보다 큰 값을 갖는다. 루트에서 가장 큰 값을 바로 얻을 수 있다는 점을 제외하면 완전 이진 트리 구조와 연산 원리는 최소 힙과 대응한다.

  • 루트는 전체 원소 중 가장 큰 값을 갖는다.
  • 각 부모 노드의 값은 그 자식 노드의 값보다 크다.
  • 같은 레벨의 노드나 왼쪽·오른쪽 형제 사이에 크기 순서가 요구되지는 않는다.

3. 힙이 아닌 경우

부모와 자식 사이의 대소 관계를 만족해도 완전 이진 트리가 아니면 힙이 아니다. 반대로 완전 이진 트리의 모양을 갖추었더라도 최소 힙에서 부모가 자식보다 큰 경우처럼 우선순위 조건을 위반하면 힙이 아니다.

구분루트부모·자식 관계
최소 힙최솟값부모 값 < 자식 값
최대 힙최댓값부모 값 > 자식 값

힙은 전체 정렬 트리가 아니다. 최소 힙에서는 부모가 자식보다 작다는 관계만 보장되므로, 왼쪽 자식과 오른쪽 자식 중 어느 값이 더 작은지는 정해져 있지 않다.

제4장 배열을 이용한 힙의 구현

1. 완전 이진 트리와 배열

힙은 완전 이진 트리이므로 노드를 레벨 순서대로 배열에 빈틈없이 저장할 수 있다. 연결 리스트로 구현하는 것보다 주소를 위한 별도 링크 필드가 필요하지 않아 기억 장소 측면에서 유리하며, 부모와 자식의 위치도 인덱스 계산으로 빠르게 구할 수 있다.

강의록의 구현은 배열 인덱스 1부터 힙 데이터를 저장한다. 배열의 1번 위치가 루트이고, 그 다음 레벨의 노드들이 2번과 3번, 다음 레벨이 4번부터 이어진다. 구조체에는 힙 원소를 저장하는 배열과 현재 데이터 개수를 나타내는 size가 포함된다.

인덱스가 1부터 시작할 때: 위치 i의 왼쪽 자식은 2i, 오른쪽 자식은 2i+1, 부모는 i/2의 정수 몫에 놓인다.

2. 배열 표현의 장점

관점배열 기반 힙의 장점
실행부모와 자식 위치를 인덱스 연산으로 계산할 수 있다.
기억 장소각 노드에 자식 주소를 저장하는 링크 필드가 필요하지 않다.
구조 유지완전 이진 트리의 레벨 순서를 배열의 연속 위치로 표현할 수 있다.

예를 들어 최소 힙의 배열이 인덱스 1부터 1, 15, 5, 20, 16, 10, 19, 25, 30, 17, 18, 12, 23으로 저장되면 배열의 순서만으로도 완전 이진 트리의 부모·자식 관계를 재구성할 수 있다.

제5장 힙의 루트 삭제

1. 삭제의 기본 전략

힙에서 삭제는 루트 원소를 대상으로 한다. 최소 힙이면 최솟값, 최대 힙이면 최댓값이 삭제된다. 루트를 비워 둔 채로 둘 수 없으므로 완전 이진 트리의 마지막 노드를 루트 후보 temp로 가져온 뒤, 적절한 위치까지 아래로 이동시키며 힙을 재구성한다.

  1. 루트 값을 삭제 결과 data에 저장한다.
  2. 마지막 노드를 temp에 저장하고 힙의 크기를 1 줄인다.
  3. 루트에서 시작해 두 자식 중 우선순위가 더 높은 자식을 선택한다.
  4. temp가 선택된 자식보다 우선순위가 낮으면 그 자식을 부모 위치로 올리고 아래로 내려간다.
  5. temp가 들어갈 위치를 찾으면 그 위치에 저장하고 원래 루트 값을 반환한다.

2. 최소 힙 삭제에서 자식 선택

최소 힙에서는 두 자식 중 값이 더 작은 자식을 선택해야 한다. 코드의 child = 2는 루트의 왼쪽 자식에서 시작함을 뜻한다. 오른쪽 자식이 존재하고 그 값이 왼쪽 자식보다 작으면 child++로 오른쪽 자식을 선택한다.

temp <= heap[child]가 성립하면 temp가 선택된 자식보다 작거나 같으므로 최소 힙 조건을 만족하고 이동을 멈춘다. 그렇지 않으면 선택한 작은 자식을 현재 부모 위치로 올리고, 그 자식 위치를 새로운 부모 위치로 삼아 아래 레벨에서 같은 비교를 반복한다.

최소 힙 삭제: 마지막 원소를 루트 후보로 두고, 매 단계에서 두 자식 중 더 작은 자식과 비교하면서 아래 방향으로 이동한다.

3. 강의록 예제의 흐름

루트 1을 삭제한 뒤 마지막 원소 23을 루트 후보로 삼는다. 루트의 자식 15와 5 중 작은 값 5를 올리고, 다음 자식들 중 작은 값 10을 올린다. 이어서 10의 자식 12와 23 중 작은 값 12를 올린 뒤, 남은 위치에 후보 23을 저장한다. 그 결과 루트는 5가 되고 모든 부모가 자식보다 작은 최소 힙 조건이 회복된다.

삭제 과정은 마지막 원소와 루트를 단순히 한 번 교환하는 것으로 끝나지 않는다. 완전 이진 트리의 모양은 유지되지만 힙 순서가 깨질 수 있으므로 아래 방향 재구성이 반드시 필요하다.

제6장 힙의 노드 삽입

1. 삽입의 기본 전략

새 원소는 완전 이진 트리의 모양을 유지하기 위해 배열의 마지막 위치에 먼저 들어간다. 그 위치에서 부모와 값을 비교하여 힙 조건을 위반하면 부모를 아래로 내리고 새 원소가 들어갈 위치를 위로 올린다. 삭제가 아래 방향으로 재구성되는 것과 달리 삽입은 위 방향으로 재구성된다.

  1. 힙 크기를 1 증가시키고 새 마지막 위치 i를 정한다.
  2. 최소 힙에서 새 값이 부모 heap[i/2]보다 작으면 부모를 i 위치로 내린다.
  3. i를 i/2로 바꾸어 한 레벨 위에서 비교를 반복한다.
  4. 루트에 도달하거나 부모보다 작지 않으면 현재 i에 새 값을 저장한다.

2. 최소 힙 삽입 코드의 조건

강의록의 조건식은 (i != 1) && (data < heap[i/2])이다. 현재 위치가 루트가 아니고 새 값이 부모보다 작을 때만 부모를 아래로 이동한다. 비교가 끝난 뒤 heap[i] = data로 새 값을 최종 위치에 저장한다.

3. 값 7 삽입 예제

최소 힙의 마지막 위치에 7을 삽입하면 부모 12보다 작으므로 12가 아래로 내려간다. 한 레벨 위에서 다시 비교하면 7은 부모 10보다 작아 10도 아래로 내려간다. 다음 부모 5보다는 크므로 이동을 멈추고 그 위치에 7을 저장한다. 결과적으로 5는 루트에 남고, 새 값 7도 자식보다 작은 부모 위치를 차지하여 최소 힙 조건이 유지된다.

연산임시 출발 위치재구성 방향최소 힙의 비교 대상
루트 삭제마지막 원소를 루트 후보로 사용위에서 아래두 자식 중 더 작은 값
노드 삽입새 원소를 마지막 위치에 추가아래에서 위현재 위치의 부모

핵심 개념 정리

힙 단원 한눈에 보기

  • 일반 큐는 입력 순서, 우선순위 큐는 우선순위에 따라 원소를 삭제한다.
  • 힙은 완전 이진 트리의 모양과 부모·자식 사이의 우선순위 조건을 함께 만족한다.
  • 최소 힙의 루트는 최솟값이고 부모는 자식보다 작다.
  • 최대 힙의 루트는 최댓값이고 부모는 자식보다 크다.
  • 형제 노드나 같은 레벨의 전체 원소가 정렬되어 있을 필요는 없다.
  • 완전 이진 트리인 힙은 배열로 효율적으로 표현할 수 있다.
  • 인덱스 1부터 저장하면 왼쪽 자식은 2i, 오른쪽 자식은 2i+1, 부모는 i/2이다.
  • 루트 삭제는 마지막 원소를 가져와 더 우선적인 자식을 따라 아래로 이동한다.
  • 삽입은 마지막 위치에서 부모와 비교하며 위로 이동한다.

힙 문제는 완전 이진 트리의 모양부모·자식의 우선순위 관계를 동시에 확인해야 한다. 최소 힙에서는 삭제할 때 작은 자식을 선택해 아래로 내려가고, 삽입할 때 새 값이 부모보다 작은 동안 위로 올라간다는 반대 방향의 흐름을 구분하는 것이 가장 중요하다.

예상문제 20선

1. 우선순위 큐에 대한 설명으로 옳은 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④
우선순위 큐는 도착 순서보다 각 원소의 우선순위를 기준으로 삭제 대상을 선택한다.

2. 일반 큐와 우선순위 큐의 차이로 가장 적절한 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②
일반 큐는 선입선출이지만 우선순위 큐에서는 저장된 원소의 우선순위가 삭제 순서를 정한다.

3. 작은 값일수록 우선순위가 높은 배열 우선순위 큐에서 삭제 시 가장 먼저 찾아야 하는 값은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①
작은 값이 높은 우선순위를 나타내는 조건에서는 최솟값이 다음 삭제 대상이다.

4. 힙을 정의하는 두 조건의 올바른 조합은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③
힙은 완전 이진 트리의 모양을 유지하면서 최소 또는 최대 힙의 부모·자식 관계를 만족해야 한다.

5. 힙 ADT의 peek() 연산은 무엇을 하는가?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①
peek는 우선순위가 가장 높은 루트값을 확인하되 힙의 원소나 구조를 변경하지 않는다.

6. 힙 ADT의 연산과 기능의 연결로 옳지 않은 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④
힙의 삭제 연산은 우선순위가 가장 높은 루트 데이터를 삭제하며 이후 힙을 재구성한다.

7. 최소 힙에 대한 설명으로 옳은 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②
최소 힙은 각 부모가 자식보다 작다는 조건을 트리 전체에서 만족하므로 루트가 최솟값이다.

8. 최대 힙의 루트에 저장되는 값은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③
최대 힙은 모든 부모가 자식보다 크므로 그 관계의 최상단인 루트에 최댓값이 놓인다.

9. 최소 힙에서 반드시 성립하지 않아도 되는 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②
힙은 부모와 자식의 관계만 보장하며 형제나 같은 레벨 전체의 정렬 순서는 보장하지 않는다.

10. 부모가 자식보다 작다는 조건은 만족하지만 트리 모양이 완전 이진 트리가 아니라면?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①
힙은 대소 관계뿐 아니라 완전 이진 트리라는 구조 조건도 동시에 충족해야 한다.

11. 완전 이진 트리인 힙을 배열로 구현하기 좋은 이유는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④
완전 이진 트리는 레벨 순서 배열 표현이 자연스럽고 별도의 링크 없이 인덱스 계산으로 연결 관계를 얻는다.

12. 힙 배열의 인덱스가 1부터 시작할 때 위치 i의 오른쪽 자식 인덱스는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③
인덱스 1 기반 힙에서 왼쪽 자식은 2i, 오른쪽 자식은 2i+1에 저장된다.

13. 최소 힙의 루트를 삭제한 직후 빈 루트의 후보로 가져오는 원소는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①
마지막 원소를 제거해 루트 후보로 사용하면 완전 이진 트리의 모양을 유지한 채 힙 순서를 재구성할 수 있다.

14. 최소 힙 삭제의 하향 재구성에서 두 자식 중 선택해야 하는 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③
작은 자식을 부모 위치로 올려야 그 아래에서도 부모가 자식보다 작은 최소 힙 조건을 유지할 수 있다.

15. 최소 힙 삭제 중 temp <= heap[child]가 성립하면 수행할 일은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④
후보값이 우선 선택된 작은 자식보다 작거나 같으면 그 위치에 두어도 부모·자식 조건이 성립한다.

16. 최소 힙에 새 원소를 삽입할 때 첫 저장 후보 위치는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②
완전 이진 트리의 모양을 유지하도록 새 원소의 자리를 마지막에 만든 뒤 부모와 비교하며 위로 이동한다.

17. 최소 힙 삽입에서 새 값이 부모보다 작을 때 수행되는 동작은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③
최소 힙 조건을 회복하기 위해 더 큰 부모를 아래로 이동시키고 새 값은 위쪽 부모와 다시 비교한다.

18. 강의록의 최소 힙에 값 7을 삽입할 때 비교가 끝나는 조건은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④
7은 12와 10보다 작아 위로 이동하지만 부모 5보다는 크므로 그 위치에서 이동을 멈춘다.

19. 최소 힙의 삭제와 삽입 재구성 방향을 바르게 연결한 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②
삭제는 마지막 원소를 루트 후보로 두고 내려가며, 삽입은 마지막 위치의 새 원소를 부모와 비교하며 올라간다.

20. 힙에 대한 설명으로 옳지 않은 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①
최소 힙은 부모가 자식보다 작다는 부분 순서만 보장하며 배열 전체의 완전한 오름차순은 요구하지 않는다.

댓글