![[백준 11286번] 절댓값 힙](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbp0vol%2FbtsL7cUNE5v%2Fr40RyNCB349N2nMcTJ72F1%2Fimg.png)
[백준 11286번] 절댓값 힙백준2025. 2. 5. 14:22
Table of Contents
728x90
[백준 11286번] 절댓값 힙
- 문제 링크 : 수 찾기
- 난이도 : 실버 1
- 풀이 날짜 : 2025-02-05
📖 문제 설명
절댓값 힙은 다음과 같은 연산을 지원하는 자료구조이다.
- 배열에 정수 x (x ≠ 0)를 넣는다.
- 배열에서 절댓값이 가장 작은 값을 출력하고, 그 값을 배열에서 제거한다. 절댓값이 가장 작은 값이 여러개일 때는, 가장 작은 수를 출력하고, 그 값을 배열에서 제거한다.
프로그램은 처음에 비어있는 배열에서 시작하게 된다.
📌 입력
첫째 줄에 연산의 개수 N(1≤N≤100,000)이 주어진다. 다음 N개의 줄에는 연산에 대한 정보를 나타내는 정수 x가 주어진다. 만약 x가 0이 아니라면 배열에 x라는 값을 넣는(추가하는) 연산이고, x가 0이라면 배열에서 절댓값이 가장 작은 값을 출력하고 그 값을 배열에서 제거하는 경우이다. 입력되는 정수는 -2^31보다 크고, 2^31보다 작다.
📌 출력
입력에서 0이 주어진 회수만큼 답을 출력한다. 만약 배열이 비어 있는 경우인데 절댓값이 가장 작은 값을 출력하라고 한 경우에는 0을 출력하면 된다.
⌨️ 예제 입출력
입력
18
1
-1
0
0
0
1
1
-1
-1
2
-2
0
0
0
0
0
0
0
출력
-1
1
0
-1
-1
1
1
-2
2
0
📝 풀이 코드
Priority Queue
from collections import defaultdict, deque
from queue import PriorityQueue
import sys
input = sys.stdin.readline
N = int(input())
pq = PriorityQueue()
for i in range(N):
request = int(input())
if request != 0:
pq.put((abs(request),request))
else:
if pq.empty():
print(0)
else:
print(pq.get()[1])
heapq
import heapq
import sys
input = sys.stdin.readline
N = int(input())
hq = []
for i in range(N):
request = int(input())
if request != 0:
heapq.heappush(hq,(abs(request),request))
else:
if not hq:
print(0)
else:
print(heapq.heappop(hq)[1])
🔍 코드 설명
- 우선순위 큐와 힙큐로 풀 수 있다.
- 성능은 힙큐가 좋다.
x = 0
일 때 큐가 비어 있으면 0을 출력하고 비어있지 않을 때는 절댓값이 최소인 값을 출력한다.- 절댓값이 같다면 음수를 출력
x = 1
일 때 큐에 새로운 값을 추가하고 정렬시킨다.
참고(GPT)
✅ PriorityQueue
vs. heapq
비교 항목 | queue.PriorityQueue |
heapq |
---|---|---|
모듈 | queue.PriorityQueue |
heapq |
내부 구현 | thread-safe 한 heapq 기반 래퍼 클래스 |
최소 힙 기반 리스트 |
속도 | 느림 (Locking overhead) | 빠름 |
사용 방식 | .put() / .get() |
heapq.heappush() / heapq.heappop() |
멀티스레드 지원 | ✅ thread-safe |
❌ thread-safe 아님 |
메모리 사용량 | 큼 (추가적인 Lock 관리) | 작음 |
✅ 결론
- 단일 스레드 환경에서는
heapq
를 사용하는 것이 훨씬 빠르고 효율적 - 멀티 스레드 환경에서 동기화가 필요하면
PriorityQueue
를 고려 - 일반적인 코딩 테스트 및 알고리즘 문제 풀이에서는
heapq
를 사용하는 것이 더 좋음
'백준' 카테고리의 다른 글
[백준 1377번] 버블 소트 (0) | 2025.02.05 |
---|---|
[백준 2750번] 수 정렬하기 (0) | 2025.02.05 |
[백준 2164번] 카드2 (0) | 2025.02.05 |
[백준 1874번] 스택 수열 (0) | 2025.02.05 |
[백준 17298번] 오큰수 (1) | 2025.02.05 |
@mane Lab :: 마네의 연구소
배움에 즐거움을 느끼는 마네의 연구소입니다. 이미지 출처 : https://www.instagram.com/hoseobiiiiiii._.0410/
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!