HelloMinchan
처음처럼
HelloMinchan
LinkedIn
전체 방문자
오늘
어제
  • 분류 전체보기 (306)
    • Backend (4)
      • NestJS (1)
      • Express (1)
      • Spring (2)
    • Infrastructure (1)
      • AWS (1)
    • Frontend (1)
      • Next.js (1)
    • Language & Runtime (4)
      • Java (2)
      • Node.js (2)
    • Computer Science (8)
      • Computer Networks (3)
      • Operating Systems (4)
      • OOP (1)
    • 독서 (4)
      • 데이터 중심 애플리케이션 설계 (3)
      • 객체지향의 사실과 오해 (1)
    • 회고 (4)
      • Project (2)
      • Career (2)
    • Deprecated (280)

채널

  • GitHub
  • LinkedIn

최근 글

태그

  • 데이터베이스
  • 개발자
  • Algospot
  • 알고스팟
  • 백준
  • front-end
  • 프로그래밍
  • Baekjoon Online Judge
  • 프로그래머스
  • 백준Python
  • back-end
  • 코딩
  • 백엔드
  • programmers
  • 프로그래머스Python
  • 백준C++
  • Database
  • 백준Go
  • 알고스팟Python
  • 프로그래머스C++

최근 댓글

인기 글

hELLO
HelloMinchan

처음처럼

[Python] heapq 사용법
Deprecated

[Python] heapq 사용법

2020. 4. 26. 20:26

Copyright ©2001-2020. Python Software Foundation

[Python] heapq 사용법

(글쓴날 : 2020.04.26)

 


* 이 글은 글쓴이가 공부한 내용을 정리하며 올리는 글입니다.

* Python3를 기준으로 작성되었습니다.


 

 

Python heapq 사용법


1) heapq란?

heapq란 자료구조 queue의 일종으로, queue의 내부 구조가 heap으로 이루어져 있다고 보시면 됩니다.

heapq는 일반 queue와 마찬가지로 추가(push), 삭제(pop) 등의 기능을 하지만, heap 구조를 유지하기 위해 추가(push) 및 삭제(pop) 시 O(log n)의 시간 복잡도가 걸리게 됩니다.

 

보통 우선순위 큐를 구현하기 위해 사용되며, heapq 모듈의 함수들은 Min Heap 기준으로 설계되어 있으므로 주의해야 합니다.


2) heapq 사용법

(1) heapq import

1
import heapq

(2) heapq 생성

(heapq는 생성해서 사용하는 것이 아니라 일반 리스트를 그대로 이용합니다!)

1
2
hq = []
print(hq)  # print결과 : []

(3) heapq.heappush( (리스트), (값) ) : 리스트에 Min Heap 기준으로 값 추가

1
2
3
4
heapq.heappush(hq, 3)
heapq.heappush(hq, 2)
heapq.heappush(hq, 1)
print(hq)  # print결과 : deque([1, 3, 2])

(4) heapq.heappop( (리스트) ) : 리스트에서 Min Heap 기준으로 값 삭제 후 반환

1
2
3
print(heapq.heappop(hq))  # print결과 : 1
print(heapq.heappop(hq))  # print결과 : 2
print(heapq.heappop(hq))  # print결과 : 3

(5) heapq.heapify( (리스트) ) : 기존 리스트를 Min Heap으로 변환

1
2
3
4
5
6
7
hq = [3, 5, 4, 1, 2]
heapq.heapify(hq)
print(heapq.heappop(hq))  # print결과 : 1
print(heapq.heappop(hq))  # print결과 : 2
print(heapq.heappop(hq))  # print결과 : 3
print(heapq.heappop(hq))  # print결과 : 4
print(heapq.heappop(hq))  # print결과 : 5

(6) Max Heap 구현하는 방법

마지막으로, Max Heap을 구현하는 방법에는 두 가지가 있습니다.

 

첫 번째 방식은, 추가 및 출력 시 값에 -를 붙이는 것입니다.

ex)

1
2
3
4
5
6
7
heapq.heappush(hq, -1)
heapq.heappush(hq, -2)
heapq.heappush(hq, -3)
 
print(-heapq.heappop(hq))  # print결과 : 3
print(-heapq.heappop(hq))  # print결과 : 2
print(-heapq.heappop(hq))  # print결과 : 1

 

두 번째 방식은, 튜플(tuple)을 이용하는 것입니다.

튜플의 첫 번째 요소에 음수화한 값을 넣고, 두 번째 요소에 원래 값을 넣은 뒤, heapq에 추가하여 출력 시 튜플의 두 번째 요소를 사용하는 원리입니다.

ex)

1
2
3
4
5
6
7
heapq.heappush(hq, (-1, 1))
heapq.heappush(hq, (-2, 2))
heapq.heappush(hq, (-3, 3))
 
print(heapq.heappop(hq)[1])  # print결과 : 3
print(heapq.heappop(hq)[1])  # print결과 : 2
print(heapq.heappop(hq)[1])  # print결과 : 1

 

 


 

 

여기까지, Python의 heapq 사용법에 대하여 알아봤습니다.

감사합니다!

저작자표시 비영리 변경금지 (새창열림)

'Deprecated' 카테고리의 다른 글

[Baekjoon Online Judge] 백준 1715번 카드 정렬하기(C++, Python)  (0) 2020.04.27
[Baekjoon Online Judge] 백준 11286번 절댓값 힙(C++, Python)  (0) 2020.04.26
[C++] priority_queue 사용법  (0) 2020.04.26
[Baekjoon Online Judge] 백준 1927번 최소 힙(C++, Python)  (0) 2020.04.25
[Baekjoon Online Judge] 백준 11279번 최대 힙(C++, Python)  (0) 2020.04.25
    'Deprecated' 카테고리의 다른 글
    • [Baekjoon Online Judge] 백준 1715번 카드 정렬하기(C++, Python)
    • [Baekjoon Online Judge] 백준 11286번 절댓값 힙(C++, Python)
    • [C++] priority_queue 사용법
    • [Baekjoon Online Judge] 백준 1927번 최소 힙(C++, Python)
    HelloMinchan
    HelloMinchan
    Though you should not fear failure, You should do your very best to avoid it.

    티스토리툴바