Ch.11 고급 자료구조
면접 실전 — Trie, Two Heaps, Intervals 코딩
이론은 끝. 이제 실전 코딩입니다
오늘 배운 Trie, Two Heaps, Interval 패턴으로 면접에서 가장 빈출되는 3문제를 풀어봅니다.
알고리즘은 아는데 막상 코딩하면 막히는 이유 — 구현 디테일을 놓치기 때문
ATSO 프레임워크로 접근하고, 코드를 한 줄씩 작성하며 구현 감각을 익힙니다.
핵심 내용
Trie 클래스를 구현하세요. insert, search, startsWith 메서드를 포함합니다
A (접근법) • 각 노드: children 딕셔너리 + is_end 불리언 • insert: 글자마다 노드 따라감, 없으면 생성 • search: 글자마다 따라가고 is_end 확인 • startsWith: 글자마다 따라가고 존재만 확인
class TrieNode:
def __init__(self):
self.children = {}
self.is_end = False
class Trie:
def __init__(self):
self.root = TrieNode()
def insert(self, word: str) -> None:
node = self.root
for ch in word:
if ch not in node.children:
node.children[ch] = TrieNode()
node = node.children[ch]
node.is_end = True
def search(self, word: str) -> bool:
node = self._find(word)
return node is not None and node.is_end
def startsWith(self, prefix: str) -> bool:
return self._find(prefix) is not None
def _find(self, s: str):
node = self.root
for ch in s:
if ch not in node.children:
return None
node = node.children[ch]
return nodeT (복잡도) • insert: O(m), search: O(m), startsWith: O(m) • 공간: O(N × m) — N개 단어 S (개선): _find 헬퍼로 search와 startsWith의 중복 코드 제거
_find 헬퍼 메서드로 코드를 DRY하게! 면접관이 좋아하는 패턴입니다
숫자를 하나씩 추가하며 현재까지의 중간값을 반환하세요
A (접근법): Two Heaps • max-heap(lo): 작은 절반 (부호 반전) • min-heap(hi): 큰 절반 • 규칙: len(lo) == len(hi) 또는 len(lo) == len(hi) + 1
import heapq
class MedianFinder:
def __init__(self):
self.lo = [] # max-heap (부호 반전)
self.hi = [] # min-heap
def addNum(self, num: int) -> None:
# 항상 lo에 먼저 넣고, lo의 최대를 hi로
heapq.heappush(self.lo, -num)
heapq.heappush(self.hi, -heapq.heappop(self.lo))
# lo가 더 크거나 같도록 균형
if len(self.lo) < len(self.hi):
heapq.heappush(self.lo, -heapq.heappop(self.hi))
def findMedian(self) -> float:
if len(self.lo) > len(self.hi):
return -self.lo[0]
return (-self.lo[0] + self.hi[0]) / 2T: addNum O(log n), findMedian O(1) S: O(n) 공간 O: 정렬 유지 없이 O(log n)에 중간값 추적 가능!
회의 목록이 주어졌을 때 필요한 최소 회의실 수를 구하세요
A (접근법): 정렬 + Min-Heap • start 기준 정렬 • heap에 종료 시간 저장 • 새 회의 start >= heap[0] → 기존 방 재사용 • 아니면 새 방 추가
import heapq
def minMeetingRooms(intervals: list[list[int]]) -> int:
if not intervals:
return 0
intervals.sort(key=lambda x: x[0])
heap = [intervals[0][1]] # 첫 회의 종료 시간
for i in range(1, len(intervals)):
if intervals[i][0] >= heap[0]:
heapq.heapreplace(heap, intervals[i][1])
else:
heapq.heappush(heap, intervals[i][1])
return len(heap)T: O(n log n) — 정렬 + heap 연산 S: O(n) — 최악 모든 회의가 겹침 O: heapreplace = pop + push를 한 번에!
0,30],[5,10],[15,20],[10,25를 추적합니다
[5,10] 회의실을 [10,25]가 이어받고, [0,30]과 [15,20]은 별도 회의실. 총 3개!
오늘 배운 3문제의 면접 포인트를 정리합니다
세 문제 모두 FAANG 빈출! 구현 코드를 외우지 말고 패턴을 이해하세요
Trie 구현에서 _find 헬퍼를 만드는 이유는?
Python에서 max-heap을 구현하는 방법은?
heapreplace(heap, val)은 어떤 두 연산을 합친 것인가?
heapreplace = heappop + heap___
핵심 용어
Trie
_find 헬퍼로 DRY. is_end와 경로 존재의 차이 설명
Two Heaps
부호 반전 트릭. 크기 균형 유지 로직 설명
Meeting Rooms
heapreplace 사용. 정렬 기준(start) 명확히
퀴즈와 인터랙션으로 더 깊이 학습하세요
play_circle인터랙티브 레슨 시작