Ch.12 모의 면접 & 종합 전략
모의면접 2 — Medium 3문제 실전
Medium이 바로 **합격선**입니다
대부분의 코딩 면접은 Medium 난이도에서 합격/불합격이 갈립니다. 패턴을 조합하는 능력이 핵심입니다.
Easy는 풀겠는데, Medium부터 갑자기 막히는 이유는?
Medium = 패턴 2개 결합입니다. 하나씩 분해하면 풀 수 있습니다.
핵심 개념
LRU Cache
가장 오래 사용하지 않은 항목을 제거하는 캐시 자료구조
OrderedDict
삽입 순서를 유지하는 해시맵 — LRU 구현에 최적
핵심 내용
Medium 모의면접을 시작합니다. 패턴 결합에 집중하세요
LRU Cache 용량 `capacity`인 LRU 캐시를 구현하세요. • `get(key)` — 키가 있으면 값 반환, 없으면 -1 • `put(key, value)` — 키-값 저장. 용량 초과 시 가장 오래된 항목 삭제 두 연산 모두 O(1)이어야 합니다.
키워드 분석: O(1) 조회 → HashMap, 순서 관리 → 연결 리스트
LRU = HashMap + 이중 연결 리스트 결합. Python에서는 OrderedDict로 간단 구현 가능
Python의 OrderedDict를 활용한 깔끔한 구현입니다
from collections import OrderedDict
class LRUCache:
def __init__(self, capacity: int):
self.cache = OrderedDict()
self.capacity = capacity
def get(self, key: int) -> int:
if key not in self.cache:
return -1
# 접근한 키를 맨 뒤로 이동 (최근 사용)
self.cache.move_to_end(key)
return self.cache[key]
def put(self, key: int, value: int) -> None:
if key in self.cache:
self.cache.move_to_end(key)
self.cache[key] = value
# 용량 초과 시 가장 오래된 (맨 앞) 항목 제거
if len(self.cache) > self.capacity:
self.cache.popitem(last=False)get과 put 모두 O(1) — OrderedDict가 순서 관리를 내부적으로 처리합니다
면접에서 말하기: "OrderedDict를 써도 될까요? 안 된다면 해시맵 + 이중 연결 리스트로 직접 구현하겠습니다."
두 번째 문제입니다. 그래프 탐색 패턴을 적용합니다
Number of Islands '1'(땅)과 '0'(물)으로 이루어진 2D 그리드가 주어집니다. 섬의 개수를 세세요. (가로/세로로 연결된 '1'이 하나의 섬) 예시: [[1,1,0,0], [1,1,0,0], [0,0,1,0], [0,0,0,1]] → 3개
def num_islands(grid):
if not grid:
return 0
rows, cols = len(grid), len(grid[0])
count = 0
def dfs(r, c):
# 범위 밖이거나 물이면 종료
if r < 0 or r >= rows or c < 0 or c >= cols:
return
if grid[r][c] == '0':
return
grid[r][c] = '0' # 방문 표시
dfs(r + 1, c) # 상하좌우 탐색
dfs(r - 1, c)
dfs(r, c + 1)
dfs(r, c - 1)
for r in range(rows):
for c in range(cols):
if grid[r][c] == '1':
count += 1
dfs(r, c) # 연결된 모든 땅을 물로 변환
return count키워드 '연결된 영역' → DFS/BFS. 방문한 셀은 '0'으로 바꿔 재방문 방지
시간 O(m×n), 공간 O(m×n) 재귀 스택. 그리드 탐색 문제의 기본 템플릿입니다
세 번째 문제입니다. DP(동적 프로그래밍) 패턴입니다
Coin Change 동전 종류 `coins`와 금액 `amount`가 주어집니다. 금액을 만들 최소 동전 개수를 구하세요. 불가능하면 -1. 예시: coins = [1, 5, 10], amount = 11 → 2 (10+1)
def coin_change(coins, amount):
# dp[i] = 금액 i를 만드는 최소 동전 수
dp = [float('inf')] * (amount + 1)
dp[0] = 0 # 0원은 동전 0개
for i in range(1, amount + 1):
for coin in coins:
if coin <= i:
dp[i] = min(dp[i], dp[i - coin] + 1)
return dp[amount] if dp[amount] != float('inf') else -1키워드 '최소 개수' + '조합' → DP. dp[i] = 금액 i의 최소 동전 수
LRU Cache를 O(1)에 구현하려면 어떤 자료구조 결합이 필요한가?
Number of Islands에서 DFS 대신 BFS를 써도 시간 복잡도는 같다
Medium 3문제 클리어!
정리 노트
모의면접 2 — Medium 실전
문제별 핵심
- LRU Cache
- HashMap + 이중 연결 리스트 (OrderedDict)
- Number of Islands
- 그리드 DFS — 방문 셀 '0' 변환
- Coin Change
- DP — dp[i] = 금액 i의 최소 동전 수
패턴 결합 공식
- O(1) 조회+순서
- HashMap + 연결 리스트
- 연결 영역 탐색
- 그래프 DFS/BFS
- 최소/최대 조합
- DP (Bottom-Up)
Medium 3문제를 각각 20분 안에 풀 수 있으면 면접 합격 수준!
핵심 정리
- 1LRU Cache — 자료구조 결합 패턴
- 2Number of Islands — 그래프 DFS 패턴
- 3Coin Change — DP 패턴
- 4Medium = Easy 패턴 2개의 결합
퀴즈와 인터랙션으로 더 깊이 학습하세요
play_circle인터랙티브 레슨 시작