[프로그래머스/파이썬] 이중우선순위큐 풀이
(힙, Python, heap, heapq, heappop, heappush, remove)

1. 문제
https://school.programmers.co.kr/learn/courses/30/lessons/42628
2. 문제 해결 아이디어 (풀이)
1. 힙을 사용한다.
2. 최소힙과 최대힙 배열을 따로 만들어서 각각 삽입/삭제를 진행한다
2.1. 값 삭제를 할 때,
- 최댓값 삭제는 최대힙을 pop 해준 뒤, 최소힙에 해당 최댓값을 remove로 삭제한다.
- 최솟값 삭제는 최소힙을 pop 해준 뒤, 최대힙에 해당 최솟값을 remove로 삭제한다.
** 이때, remove할때 -최댓값, -최솟값 이렇게 -를 붙여줘야 한다.
** 최대힙은 구현을 위해 임시로 -를 붙이기 때문이다. (파이썬은 기본적으로 최소힙만 있음)
3. 배열을 순회하며 옵션에 따라 적절한 계산을 진행하면 된다.
3. 코드
import heapq
def solution(operations):
answer = []
# 1. 힙 만들기
minHeap = []
maxHeap = []
# 2. operations 배열을 순회하며 작업 진행
for operation in operations:
nowOperation = operation.split()
option = nowOperation[0]
num = int(nowOperation[1]) # int형으로 바꾼다.
# 2.1. 삽입
if option == 'I':
heapq.heappush(minHeap, num) # 최소힙
heapq.heappush(maxHeap, -num) # 최대힙 (-로 넣어야 최대)
# 2.2. 삭제
elif option == 'D' and minHeap: # 빈 큐에 데이터를 삭제하라는 연산이 주어질 경우, 해당 연산은 무시
if num == 1: # 최댓값 삭제
numMax = heapq.heappop(maxHeap) # (-로 나온다)
# 최솟값도 같이 삭제해준다.
minHeap.remove(-numMax) # (-를 +로 바꿔줌)
elif num == -1: # 최솟값 삭제
numMin = heapq.heappop(minHeap)
maxHeap.remove(-numMin) # maxHeap도 삭제. (-를 +로 바꿔줌)
# 3.1. 남은 값에 따라 [최댓값, 최솟값 리턴]
if minHeap: #힙에 값이 남아있다면?
print(minHeap)
return [max(minHeap), min(minHeap)]
else : # 힙에 값이 없다면?
return [0,0]
return answer
사용한 파이썬 힙 라이브러리 및 함수 설명은 아래와 같다.
1. heapq.heappush (힙, 값) : 힙을 추가한다
2. heapq.heappop (힙) : 힙에서 최솟값을 꺼내고 반환한다.
3. 배열.remove(값) : 배열에서 해당 값을 삭제한다. (index가 아니고 '값'으로 삭제한다.)
4. 마무리


이 문제는 2번만에 스스로 풀 수 있게 됐다..!
요즘 문제들을 복습하고 있는데, 확실히 복습하니 문제를 푸는 속도도 점점 빨라지고 익숙해지는 것 같다!
화이팅!
'코딩테스트 > 파이썬' 카테고리의 다른 글
| [백준/23630/파이썬] 가장 긴 부분 수열 구하기 풀이 (비트마스킹, Python + 수열까지 구하는 코드 포함) (3) | 2025.06.12 |
|---|---|
| [프로그래머스/파이썬] 입국심사 풀이 (이진탐색, 이분탐색, python) (0) | 2025.05.16 |
| [프로그래머스/파이썬] 디스크 컨트롤러 풀이 (heap, sort, heapq, heappush, heappop, 힙) (0) | 2025.05.13 |
| [프로그래머스/파이썬/JS] 게임 맵 최단걸이 풀이 (bfs, deque, python, deepcopy, JavaScript, 자바스크립트) (0) | 2025.05.09 |
| [프로그래머스/파이썬] 타겟 넘버 중복순열 풀이 (Python, product, 반복문) (0) | 2025.05.08 |
댓글