일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- mongoose
- Sequelize
- GIT
- 정렬
- Queue
- flask
- JavaScript
- AWS
- nestjs
- MySQL
- dfs
- OCR
- Python
- Nest.js
- 게임
- game
- 자료구조
- Dinosaur
- Express
- 공룡게임
- MongoDB
- TypeScript
- typeORM
- jest
- Bull
- cookie
- nodejs
- class
- react
- Today
- Total
포시코딩
5월5일 - [Python] PriorityQueue(우선순위 큐), heapq 본문
PriorityQueue
사용법
from queue import PriorityQueue
pqueue = PriorityQueue()
pqueue.put((5, 'Python'))
pqueue.put((15, 'Javascript'))
pqueue.put((10, 'Java'))
arr = []
while not pqueue.empty():
value, data = pqueue.get()
arr.append((value, data))
print(arr)
# [(5, 'Python'), (10, 'Java'), (15, 'Javascript')]
선언
from queue import PriorityQueue
pqueue = PriorityQueue()
데이터 삽입
pqueue.put((1, 'Python')) # 우선순위값(숫자), 데이터)
우선순위가 높을수록 우선순위 값이 낮아야 한다.
데이터 추출
우선순위, 데이터 = pqueue.get()
제일 앞에 위치한 (제일 우선순위가 높은) 데이터가 추출된다.
우선순위가 같은 경우
from queue import PriorityQueue
pqueue = PriorityQueue()
pqueue.put((2, 1))
pqueue.put((2, -1))
pqueue.put((2, 0))
print(pqueue.get()) # (2 -1)
print(pqueue.get()) # (2 0)
print(pqueue.get()) # (2 1)
우선순위 큐는 제일 첫번째 값에 대해서만 우선순위를 결정하는게 아닌
n번째 값들에 대해 1부터 n까지 작을 값을 기준으로 오름차순으로 정렬한다.
즉, 1번째 값이 같을 경우 2번째 값들이 작은 값부터 오름차순으로 정렬되게 된다.
우선순위를 반대로
from queue import PriorityQueue
pqueue = PriorityQueue()
pqueue.put((-5, 'Python'))
pqueue.put((-15, 'Javascript'))
pqueue.put((-10, 'Java'))
arr = []
while not pqueue.empty():
value, data = pqueue.get()
arr.append((value, data))
print(arr)
# [(-15, 'Javascript'), (-10, 'Java'), (-5, 'Python')]
heapq
https://slowsure.tistory.com/130
[Python/파이썬] PriorityQueue & heapq / 우선순위큐와 힙큐
백준에서 문제를 풀다가 Priority Queue 와 Heapq 차이로 문제 시간에 걸릴 수도 안 걸릴 수도 있다는걸 알았다. Priority Queue 와 Heaq의 차이를 알아보기 위해서 라이브러리를 뜯어서 맛보자 1. 라이브러
slowsure.tistory.com
공부하다가 놀라운 반전을 발견했는데
위 포스팅에 따르면 파이썬에서 PriorityQueue는 heapq 그 자체를 사용하는 라이브러리였다.
단지, Thread-safe 하게 사용하기 위해 확인 과정을 거치는게 다른 점인데
이 때문에 특정 알고리즘 문제에서 PriorityQueue를 사용했을 때보다
heapq를 사용했을 때가 훨씬 시간이 적게 걸리는 걸 알 수 있었다.
문제
https://www.acmicpc.net/problem/11286
11286번: 절댓값 힙
첫째 줄에 연산의 개수 N(1≤N≤100,000)이 주어진다. 다음 N개의 줄에는 연산에 대한 정보를 나타내는 정수 x가 주어진다. 만약 x가 0이 아니라면 배열에 x라는 값을 넣는(추가하는) 연산이고, x가 0
www.acmicpc.net
PriorityQueue를 사용한 코드
from queue import PriorityQueue
pqueue = PriorityQueue()
import sys
input = sys.stdin.readline
for _ in range(int(input())):
x = int(input())
if x != 0:
pqueue.put((abs(x), x))
else:
if pqueue.empty():
print(0)
else:
print(pqueue.get()[1])
heapq를 사용한 코드
import sys
input = sys.stdin.readline
import heapq
arr = []
for _ in range(int(input())):
x = int(input())
if x != 0:
heapq.heappush(arr, (abs(x), x))
else:
if len(arr) == 0:
print(0)
else:
print(heapq.heappop(arr)[1])
'TIL' 카테고리의 다른 글
7월17일 - 패키지 매니저 비교 (npm, yarn, yarn-berry, pnpm) (0) | 2023.07.17 |
---|---|
7월16일 - 자료구조 (Queue, Stack, Hash) with. JavaScript (0) | 2023.07.17 |
5월1일 - [Python] list와 set에서의 데이터 찾기 차이 - 배열과 해시 테이블 (0) | 2023.05.02 |
4월25일 - BFS, 파이썬 범위 만족시키기 & 계산 결과들 활용 (0) | 2023.04.25 |
4월12일 - 함수의 범위 - 작성중 (0) | 2023.04.12 |