알고리즘 입문 수업을 듣고 중요한 내용을 정리했습니다.
개인 공부 후 자료를 남기기 위한 목적이므로 내용 상에 오류가 있을 수 있습니다.
문제
[최소힙]
최소힙은 완전이진트리로 구현된 자료구조 이다.
그 구성은 부모 노드값이 왼쪽자식과 오른쪽자식 노드 값보다 작게 트리룰 구성하는 것이다.
그렇게 하면 트리의 루트(root)노드에는 입력된 값들 중 가장 작은 값이 저장된다.
예를 들어, 5 3 2 1 4 6 7순으로 입력되면 최소힙 트리는 아래와 같이 구성된다.
최소힙 자료를 이용하여 다음의 연산을 하는 프로그램을 작성하시오.
- 자연수가 입력되면 최소힙에 입력한다.
- 숫자 0이 입력되면 최소힙에서 최소값을 꺼내어 출력한다. (단, 출력할 자료가 없으면 -1을 출력함)
- -1이 입력되면 프로그램을 종료한다.
*입력 설명
첫 번째 줄부터 숫자가 입력된다.
입력되는 숫자는 100,000개 이하이며 각 숫자의 크기는 정수형 범위에 있다.
*출력 설명
연산을 한 결과를 보여준다.
풀이(Python)
답안
import sys
import heapq as hq
sys.stdin = open('AA/input_41.txt', 'rt')
a = []
while True:
n = int(input())
if n == -1:
break
if n == 0:
if len(a) == 0:
print(-1)
else:
print(hq.heappop(a))
else:
hq.heappush(a, n)
'''
출력:
3
5
2
'''
input_41.txt(입력)
5
3
6
0
5
0
2
4
0
-1
중요내용
- 같은 레벨의 노드에 데이터를 채울 경우, 반드시 왼쪽 노드부터 데이터를 넣는다.
- 부모 노드가 자식 노드보다 크면, 두 노드를 스왑하여 최소힙 조건을 만족시킨다.
- 즉, 노드의 데이터를 채울 때에는 레벨 순으로 왼쪽부터 채우며 입력된 노드 값들은 최소힙 조건을 만족시키기 위해 서로 스왑된다.
- 최소힙 구조에서 데이터를 추출하고 삽입할 때에는 heappop() 함수와 heappush() 함수를 사용한다.
- 일반적으로 최소힙 구조를 완성하면 heappop() 함수를 통해 루트노드 값을 추출하고, 최소힙에서 가장 낮은 레벨의 맨 우측 노드 값을 루트노드 값으로 넣어준다. 그 이후 다시 최소힙 구조를 완성시키기 위해 노드 간 스왑을 진행한다. (이러한 과정을 다운힙 과정이라고 함)
- 만약, 최소힙 구조에 노드 값을 삽입하면 업힙을 통해 최소힙 구조를 완성시키고 반대로 노드 값을 추출하면 다운힙을 통해 최소힙 구조를 완성시킨다.
- 기본적으로 heapq 자료구조는 최소힙 구조로 데이터를 배열한다.
- hq.heappop(a) 함수는 리스트 a에서 루트노드 값을 추출하는 코드이다.
- hq.heappush(a, n) 함수는 리스트 a에 최소힙(완전이진트리)의 구조로 n 값을 넣어주는 코드이다.
'알고리즘' 카테고리의 다른 글
Algorithm - 재귀함수와 스택 자료구조(선수지식) (0) | 2021.12.14 |
---|---|
Algorithm - 최대힙 (0) | 2021.12.09 |
Algorithm - 아나그램(리스트 해쉬) (0) | 2021.12.07 |
Algorithm - 아나그램(딕셔너리 해쉬) (0) | 2021.12.07 |
Algorithm - 단어 찾기(딕셔너리 해쉬) (0) | 2021.12.06 |
댓글