Ch.11 고급 자료구조
Interval 문제 — 겹치는 구간 다루기
회의실이 몇 개나 있어야 할까?
10개의 회의가 잡혀 있습니다. 어떤 회의는 겹치고, 어떤 건 안 겹칩니다. 동시에 최대 몇 개의 회의가 진행되는지 알아야 회의실 수를 정할 수 있습니다.
모든 쌍을 비교하면 O(n²). 더 빠른 방법은 없을까?
정렬 + 스캔으로 O(n log n)에 해결합니다. Interval 문제의 핵심 패턴을 배웁니다.
핵심 개념
Interval
[start, end] 형태의 구간. 회의 시간, 일정, 범위 등
Overlapping
두 구간이 겹침. a.start < b.end and b.start < a.end
핵심 내용
Interval 문제는 면접에서 매우 자주 출제됩니다
대표 문제들 • Merge Intervals (겹치는 구간 합치기) • Insert Interval (새 구간 삽입) • Meeting Rooms (회의실 배정) • Non-overlapping Intervals (최소 제거)
겹치는 구간을 합치는 3단계: 1) 정렬 2) 스캔 3) 병합
def merge(intervals: list[list[int]]) -> list[list[int]]:
intervals.sort(key=lambda x: x[0]) # start 기준 정렬
merged = [intervals[0]]
for start, end in intervals[1:]:
if start <= merged[-1][1]: # 겹침!
merged[-1][1] = max(merged[-1][1], end) # 병합
else:
merged.append([start, end]) # 새 구간
return merged시간: O(n log n) — 정렬이 지배적 공간: O(n) — merged 배열 핵심: 정렬 후 현재 구간의 start ≤ 이전 구간의 end이면 겹침
1,3],[2,6],[8,10],[15,18을 병합 과정을 추적합니다
동시에 진행되는 회의의 최대 개수 = 필요한 회의실 수
방법 1: 정렬 + 두 포인터 시작 시간과 끝나는 시간을 따로 정렬합니다
def minMeetingRooms(intervals: list[list[int]]) -> int:
starts = sorted(i[0] for i in intervals)
ends = sorted(i[1] for i in intervals)
rooms = 0
end_ptr = 0
for start in starts:
if start < ends[end_ptr]: # 새 회의실 필요
rooms += 1
else: # 기존 회의실 재사용
end_ptr += 1
return rooms시간: O(n log n) — 정렬 공간: O(n) 핵심: start < 가장 빠른 end → 회의실 추가, 아니면 재사용
방법 2: min-heap으로 가장 빨리 끝나는 회의를 추적합니다
import heapq
def minMeetingRooms(intervals: list[list[int]]) -> int:
intervals.sort(key=lambda x: x[0])
heap = [] # 현재 사용 중인 회의실의 종료 시간
for start, end in intervals:
if heap and start >= heap[0]: # 가장 빨리 끝나는 회의실 재사용
heapq.heapreplace(heap, end)
else:
heapq.heappush(heap, end) # 새 회의실
return len(heap) # 힙 크기 = 동시 사용 회의실 수heap[0]이 가장 빨리 끝나는 회의. 새 회의 시작이 그보다 늦으면 재사용!
0,30],[5,10],[15,20으로 Heap 풀이를 추적합니다
[5,10] 회의가 끝나고 그 회의실에서 [15,20]이 시작됩니다. 최대 동시 회의 = 2개
Interval 문제를 만나면 이 체크리스트를 따르세요
Interval 문제의 95%는 '정렬 → 스캔 → 조건 분기'로 해결됩니다!
Merge Intervals의 시간 복잡도는?
Meeting Rooms II에서 heap에 저장하는 것은?
1,5],[2,3],[4,6을 merge하면 결과는?
핵심 용어
Interval
[start, end] 구간 — 회의/일정/범위
Merge
겹치는 구간을 하나로 합치기
Sweep Line
시작점/끝점을 이벤트로 처리하는 기법
정렬 기준 선택
start 기준이 기본. 문제에 따라 end 기준도
겹침 조건 정의
a.start < b.end and b.start < a.end
스캔 방향 결정
왼→오 스캔하며 상태 업데이트
자료구조 선택
Heap(동시성), Stack(중첩), 배열(병합)
시각 자료
퀴즈와 인터랙션으로 더 깊이 학습하세요
play_circle인터랙티브 레슨 시작