코딩테스트 준비
stack vs. heapq 문제 차이 비교
Gom3rye
2025. 12. 17. 12:50
728x90
반응형
🔥 핵심 한 줄 요약
heapq는 “여러 후보 중 최선 1개를 계속 고르는 문제”
stack은 “앞에서 한 선택을 뒤에서 취소해야 하는 문제”
이 한 줄을 기준으로 보면 대부분 문제가 정리된다.
1️⃣ heapq 문제
- 회의실 배정
- 동시에 열리는 회의의 최대 개수
- 또는 필요한 최소 회의실 수
📌 이 문제에서 우리가 반복하는 질문
“지금 시작하는 회의가 기존 회의 중 가장 빨리 끝나는 회의를 재사용할 수 있는가?”
👉 매 순간 여러 회의 중 ‘가장 빨리 끝나는 회의 1개’만 중요
📌 그래서 heapq가 딱 맞음
- q에는 현재 진행 중인 회의들의 종료 시간
- q[0] = 가장 빨리 끝나는 회의
- 그 하나만 보면 됨 ❗
for start, end in info:
if q and q[0] <= start: # 재활용 가능
heapq.heappop(q)
heapq.heappush(q, end)
📌 과거 선택을 취소하지 않음
- 이미 시작한 회의는 되돌리지 않음
- 단지 “끝났는지”만 확인
2️⃣ 반대로 stack 문제는 뭐가 다를까?
❌ 크게 만들기(백준 2812) 에서 우리가 묻는 질문
“현재까지 선택한 숫자 중 어떤 걸 버릴지 다시 결정해야 하는가?”
정답: YES
📌 예제 다시 보기
4177252841 K=4
진행 중:
4
41
417 ← 7이 1보다 크고, 4보다 크니까 차례대로 빼주기
77
772 ← 2 등장 → 앞의 7은 유지
7725 ← 5 등장 → 앞의 2는 제거해야 더 큼 ❗
7752
👉 이미 선택한 숫자를 다시 취소해야 함
❌ heapq로는 이게 불가능
heapq는:
- “가장 큰 것”을 알려줄 뿐
- 누가 언제 들어왔는지
- 앞자리에 있는지
- 지금 지워야 하는지
👉 이 정보들을 전부 잃어버림
3️⃣ 구조적으로 비교해보자
| 기준 | heapq (회의실) | stack (크게 만들기) |
| 후보 개수 | 여러 개 | 사실상 연속된 과거 선택 |
| 관심 대상 | 항상 “최선 1개” | 바로 직전 선택 |
| 과거 선택 취소 | ❌ | ✅ |
| 순서 유지 | 중요 ❌ | 필수 ✅ |
| 핵심 연산 | 최솟값 조회 | pop / push |
| 문제 본질 | 자원 관리 | 선택 수정 |
4️⃣ 결정적인 질문 3가지
✅ 질문 1
지금 선택이 나중에 취소될 수 있는가?
- YES → stack
- NO → heapq 가능
✅ 질문 2
후보가 여러 개 있고, 그중 최선 하나만 중요할까?
- YES → heapq
- NO → stack
✅ 질문 3
입력 순서를 반드시 유지해야 하나?
- YES → stack
- NO → heapq 가능
5️⃣ 두 문제를 한 문장으로 비교하면
회의실 문제
“지금까지 열린 회의 중 가장 빨리 끝나는 것 하나만 알면 된다”
크게 만들기
“앞자리에 있는 작은 숫자는 언제든지 취소될 수 있다”
728x90
반응형