최소힙

최소힙은 완전이진트리로 구현된 자료구조입니다. 그 구성은 부모 노드값이 왼쪽 자식과 오른쪽 자식노드의 값보다 작게 트리를 구성하는 것입니다. 그렇게 하면 트리의 루트(root)노드는 입력된 값들 중 가장 작은 값이 저장되어 있습니다. 예를 들어 5 3 2 1 4 6 7 순으로 입력되면 최소힙 트리는 아래와 같이 구성됩니다.

최소힙 자료를 이용하여 다음과 같은 연산을 하는 프로그램을 작성하세요.

 

1) 자연수가 입력되면 최소힙에 입력한다.
2) 숫자 0 이 입력되면 최소힙에서 최솟값을 꺼내어 출력한다.
(출력할 자료가 없으면 -1를 출력한다.)
3) -1이 입력되면 프로그램 종료한다.

 

▣ 입력설명

첫 번째 줄부터 숫자가 입력된다. 입력되는 숫자는 100,000개 이하이며 각 숫자의 크기는 정수형 범위에 있다.

 

▣ 출력설명

2) 연산을 한 결과를 보여준다.

 

▣ 입력예제 1

5
3
6
0
5
0
2
4
0
-1

 

▣ 출력예제 1

3
5
2

 


풀이

힙자료구조를 이용한다.

pop 하면 가장 작은 수를 가진 루트 노드가 항상 pop 된다.

그리고 빈자리는 트리의 레벨 상 가장 뒤에 있는 노드가 채워지고, 그 노드와 자식노드를 비교하면서 다운 힙 하게 된다.

push 하면 부모노드와 비교하면서 업 힙 하게 된다.

 

힙 자료구조

heapq 모듈은 리스트를 최소 힙처럼 다룰 수 있도록 하기 때문에, 빈 리스트를 생성한 후 heapq의 함수를 호출할 때마다 리스트를  인자에 넘겨야 한다.

 

  • heapq.heappush(heap, item) : item을 heap에 추가 
  • heapq.heappop(heap) : heap에서 가장 작은 원소를 pop & 리턴. 비어 있는 경우 IndexError가 호출됨.  
  • heapq.heapify(x) : 리스트 x를 즉각적으로 heap으로 변환함 (in linear time, O(N) )

 


코드

import heapq as hq
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) # a라는 리스트에 n 값을 push 한다.

 

'⏰ 코딩테스트 > 자료구조 활용' 카테고리의 다른 글

최대힙  (0) 2021.10.23
아나그램(딕셔너리 해쉬)  (0) 2021.10.22
단어 찾기(해쉬)  (0) 2021.10.22
교육과정 설계(큐)  (0) 2021.10.21
응급실(큐)  (0) 2021.10.21
복사했습니다!