Ch.4 스택과 큐
괄호 검증 — 스택의 킬러 앱
면접관이 좋아하는 첫 번째 스택 문제
LeetCode #20 Valid Parentheses는 면접에서 가장 자주 나오는 스택 문제입니다. 열린 괄호와 닫힌 괄호가 올바르게 짝을 이루는지 검증해야 합니다.
괄호가 여러 종류일 때, 순서까지 맞춰야 한다면?
스택에 열린 괄호를 넣고, 닫힌 괄호가 오면 꺼내서 비교 — 이것이 핵심 패턴입니다.
핵심 내용
"( )" "{ }" "[ ]" 세 종류의 괄호가 올바르게 짝을 이루는지 확인하세요
유효한 예시 "()" → True "()[]{}" → True "{[()]}" → True 무효한 예시 "(]" → False "([)]" → False "{" → False
핵심 규칙: 가장 최근에 열린 괄호가 가장 먼저 닫혀야 합니다 — LIFO!
알고리즘은 간단합니다 열린 괄호 → push, 닫힌 괄호 → pop 후 비교
def isValid(s: str) -> bool:
stack = []
pairs = {')': '(', '}': '{', ']': '['}
for char in s:
if char in pairs: # 닫힌 괄호
if not stack or stack[-1] != pairs[char]:
return False
stack.pop()
else: # 열린 괄호
stack.append(char)
return len(stack) == 0"{[()]}"를 한 글자씩 따라가 봅시다
시간복잡도: O(n) — 문자열 한 번 순회 공간복잡도: O(n) — 최악의 경우 모든 문자가 열린 괄호
면접에서 놓치기 쉬운 엣지 케이스 3가지
코드에서 `not stack` 체크가 세 번째 케이스를 막아줍니다
"([)]"은 유효한 괄호 조합이다
isValid("{[]}")를 실행하면 stack의 최종 상태는?
stack = ___
괄호 검증 알고리즘의 시간복잡도는?
괄호 검증 마스터!
핵심 용어
열린 괄호
stack에 push
닫힌 괄호
stack에서 pop 후 짝이 맞는지 확인
끝났을 때
stack이 비어있으면 True
빈 문자열 ""
True — 닫아야 할 것이 없음
여는 괄호만 "(("
False — stack이 남아 있음
닫는 괄호 먼저 ")"
False — stack이 비어있는데 pop 시도
정리 노트
괄호 검증 — 스택의 킬러 앱
알고리즘 패턴
- 열린 괄호
- stack.append(char)
- 닫힌 괄호
- stack.pop()으로 짝 비교
- 최종 확인
- len(stack) == 0이면 True
복잡도
- 시간
- O(n) — 한 번 순회
- 공간
- O(n) — 최악 시 모두 열린 괄호
면접 팁: pairs 딕셔너리를 먼저 정의하면 코드가 깔끔해집니다!
시각 자료
핵심 정리
- 1열린 괄호 → push, 닫힌 괄호 → pop 후 비교
- 2시간 O(n), 공간 O(n)
- 3엣지 케이스: 빈 문자열, 여는 괄호만, 닫는 괄호 먼저
퀴즈와 인터랙션으로 더 깊이 학습하세요
play_circle인터랙티브 레슨 시작