파이썬 알고리즘-41 (힙) 최소힙

jiffydev·2020년 9월 13일
0

Algorithm

목록 보기
48/92
post-thumbnail

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

내 코드

lst=[]
while True:
    n=int(input())
    if n==-1:
        break
    elif n==0:
        print(min(lst))
        lst=[]
    else:
        lst.append(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)) # 루트 노드(최솟값)을 pop
    else:
        hq.heappush(a, n) # 힙의 형태로 알아서 넣어줌

반성점

  • 힙을 제대로 모르고 문제를 풀었다.

배운 것

  • 힙 자료구조: 완전 이진 트리의 일종으로 우선순위 큐를 위해 만들어진 자료구조. 최댓값/최솟값을 빠르게 찾아낼 수 있도록 만들어졌다.
  • 파이썬에서의 힙: import heapq를 통해 모듈을 가져올 수 있다. 다만 파이썬에서 제공하는 힙 모듈은 기본적으로 최소 힙 기능만을 동작한다. 또한 파이썬에서의 힙은 별개의 자료구조가 아닌 리스트를 힙으로써 다루기 때문에, 빈 리스트를 생성해서 heapq모듈의 함수를 호출할 때마다 리스트를 인자로 넘기는 구조이다.
  • heapq.heappush(lst, num): heappush()함수를 통해 원소를 추가하면 알아서 정렬해준다.
  • heapq.heappop(lst): 가장 작은 원소(루트 노드)를 삭제 & 리턴 후 정렬한다.
  • heapq.heapify(lst): 이미 원소가 들어있는 리스트를 힙으로 만들어 준다.

출처: https://www.daleseo.com/python-heapq/#%EC%B5%9C%EC%86%8C%EA%B0%92-%EC%82%AD%EC%A0%9C%ED%95%98%EC%A7%80-%EC%95%8A%EA%B3%A0-%EC%96%BB%EA%B8%B0

profile
잘 & 열심히 살고싶다

0개의 댓글