boj-review
백준 솔루션 코드를 심층 분석하고, 코딩테스트 실력 향상을 위한 실질적인 피드백을 제공합니다.
Triggers
- •
/boj-review - •"코드 리뷰"
- •"review code"
- •"백준 리뷰"
Workflow
Step 1: Find Recent Python Files
Search for recently modified Python files:
- •Look in
Greedy_Algorithm/,Dynamic_Programming/,problems/, and root directory - •Filter for
bj_*.pyorsolution.pypatterns - •Sort by modification time (most recent first)
Step 2: Select File to Review
Use AskUserQuestion to confirm which file to review:
question: "Which file do you want to review?"
header: "Select File"
options:
- label: "[most recent file]"
description: "Modified: [timestamp]"
- label: "[second recent file]"
description: "Modified: [timestamp]"
- label: "[third recent file]"
description: "Modified: [timestamp]"
Step 3: Load Problem Context
Extract problem number and load context:
- •
bj_1234.py→ problem number: 1234 - •
problems/1234/solution.py→ problem number: 1234
If problems/[number]/description.md exists:
- •Read problem constraints (N 범위, 시간 제한, 메모리 제한)
- •This is CRITICAL for complexity analysis
Step 4: Identify Algorithm Type
Analyze the code to determine algorithm type(s):
| 패턴 | 알고리즘 유형 |
|---|---|
dp[i][j], memo, @lru_cache | Dynamic Programming |
heappush, heappop, heapq | Priority Queue / Dijkstra |
deque, popleft, BFS 패턴 | BFS |
| 재귀 + 방문 체크 | DFS |
sort 후 순차 처리 | Greedy |
bisect, 이분 탐색 패턴 | Binary Search |
union, find, 부모 배열 | Union-Find |
비트 연산, 1 << n | Bitmask |
| 문자열 해싱, KMP 패턴 | String Algorithm |
| 세그먼트 트리, 펜윅 트리 | Range Query |
Step 5: Deep Analysis
5.1 Complexity Analysis
## 복잡도 분석 ### 시간 복잡도 - 현재: O(...) - 근거: [구체적인 루프/재귀 분석] - 제한 시간 내 통과 가능 여부: ✅/❌ ### 공간 복잡도 - 현재: O(...) - 메모리 제한 내 통과 가능 여부: ✅/❌
5.2 Algorithm-Specific Review
Apply the relevant checklist based on Step 4:
<details> <summary><b>Dynamic Programming Checklist</b></summary>- •
상태 정의가 명확한가?
- •dp[i]가 정확히 무엇을 의미하는지 설명 가능해야 함
- •상태 전이가 모든 케이스를 커버하는가?
- •
점화식이 올바른가?
- •수학적으로 증명 가능한가?
- •초기값(base case) 설정이 올바른가?
- •
메모이제이션 vs 타뷸레이션 선택
- •Top-down: 필요한 상태만 계산 (희소한 경우 유리)
- •Bottom-up: 전체 테이블 채움 (캐시 효율적)
- •
상태 공간 최적화 가능한가?
- •2차원 → 1차원 (이전 행만 필요한 경우)
- •슬라이딩 윈도우로 공간 절약
- •
재귀 깊이 확인
- •N > 1000이면
sys.setrecursionlimit()필요 - •또는 반복문으로 변환 권장
- •N > 1000이면
- •
그래프 표현 방식
- •인접 리스트 vs 인접 행렬
- •간선 수가 적으면 인접 리스트 권장
- •
방문 체크 타이밍
- •BFS: 큐에 넣을 때 방문 체크 (중복 방문 방지)
- •DFS: 방문할 때 체크해도 됨
- •
인덱스 일관성
- •0-indexed vs 1-indexed 혼용하지 않기
- •입력이 1-indexed면 그대로 사용하거나 변환 통일
- •
양방향 간선 처리
- •무방향 그래프면 양쪽 모두 추가
- •
graph[a].append(b)+graph[b].append(a)
- •
가중치 그래프 주의점
- •음수 가중치: Dijkstra ❌, Bellman-Ford ✅
- •모든 쌍 최단경로: Floyd-Warshall
- •
그리디 선택 속성 증명
- •현재 최선의 선택이 전체 최적해를 보장하는가?
- •반례가 존재하지 않는가?
- •
정렬 기준이 올바른가?
- •여러 기준일 때 우선순위 확인
- •
key=lambda x: (x[0], -x[1])패턴
- •
경계 조건 처리
- •같은 값일 때 처리 방식
- •빈 입력 처리
- •
탐색 범위 설정
- •left, right 초기값이 모든 가능한 답을 포함하는가?
- •정수 범위: 오버플로우 주의
- •
mid 계산
- •
mid = (left + right) // 2(오버플로우 안전) - •
mid = left + (right - left) // 2(큰 수일 때)
- •
- •
종료 조건
- •
left <= rightvsleft < right - •무한 루프 방지: left, right가 반드시 수렴하는지
- •
- •
Parametric Search인 경우
- •결정 함수가 단조성을 가지는가?
- •"X 이하로 가능한가?" → 이분 탐색 적용
- •
인덱스 경계 확인
- •배열 범위 벗어나는 접근 없는지
- •2D 배열: 행/열 순서 혼동 주의
- •
조건문 완전성
- •모든 경우의 수 처리했는가?
- •else 케이스 누락 없는가?
- •
반복 종료 조건
- •무한 루프 가능성 확인
- •최대 반복 횟수 제한 필요한가?
5.3 Common Mistake Detection
반드시 확인해야 할 실수 패턴:
| 실수 유형 | 확인 방법 | 수정 방법 |
|---|---|---|
| Off-by-one Error | range(n) vs range(n+1) | 경계값 테스트 |
| 정수 나눗셈 | / vs // 혼동 | 의도 확인 후 수정 |
| 재귀 깊이 초과 | N > 1000 + 재귀 사용 | sys.setrecursionlimit(N+100) |
| 입력 개수 0 | 빈 리스트 처리 안 됨 | 조건문 추가 |
| 음수/0 입력 | 처리 로직 없음 | 엣지 케이스 추가 |
| 부동소수점 비교 | == 사용 | abs(a-b) < 1e-9 |
| 전역 변수 초기화 | 테스트 케이스 간 공유 | 함수 내부로 이동 |
5.4 Performance Optimization Check
N 범위별 허용 복잡도:
| N 범위 | 최대 연산 | 허용 복잡도 | 적합한 알고리즘 |
|---|---|---|---|
| N ≤ 10 | 10! = 3.6M | O(N!) | 완전 탐색, 순열 |
| N ≤ 20 | 2^20 = 1M | O(2^N) | 비트마스킹, 백트래킹 |
| N ≤ 100 | 1M | O(N³) | 플로이드-워셜 |
| N ≤ 3,000 | 9M | O(N²) | 단순 DP, 브루트포스 |
| N ≤ 100,000 | 1.7M | O(N log N) | 정렬, 이분탐색, 세그트리 |
| N ≤ 1,000,000 | 1M | O(N) | 선형 스캔, 해시 |
| N ≤ 10^8 | 100M | O(N) 또는 O(1) | 수학적 공식 |
현재 코드가 제한 조건에서 통과 가능한지 판단:
- •시간 제한 1초 ≈ 1억 연산
- •시간 제한 2초 ≈ 2억 연산
- •PyPy3: Python3 대비 약 3~5배 빠름
Step 6: BOJ-Specific Optimization
필수 최적화 체크리스트:
# ❌ 느린 코드
n = int(input())
for i in range(n):
print(result[i])
# ✅ 빠른 코드
import sys
input = sys.stdin.readline
n = int(input())
print('\n'.join(map(str, result)))
| 패턴 | 느린 버전 | 빠른 버전 | 효과 |
|---|---|---|---|
| 입력 | input() | sys.stdin.readline() | 10배+ |
| 다량 출력 | 반복 print() | '\n'.join() + 단일 print | 5배+ |
| 리스트 생성 | for + append | 리스트 컴프리헨션 | 2배 |
| 멤버십 테스트 | in list | in set | O(n)→O(1) |
| 카운팅 | 수동 딕셔너리 | Counter | 가독성+속도 |
| 정렬 키 | 비교 함수 | key= 파라미터 | 2배 |
PyPy3 vs Python3 선택 기준:
- •재귀 깊은 코드: Python3 권장 (PyPy 재귀 느림)
- •반복문 무거운 코드: PyPy3 권장
- •메모리 민감한 코드: Python3 권장 (PyPy 메모리 2배)
Step 7: Edge Case Analysis
문제 유형별 필수 엣지 케이스:
| 문제 유형 | 반드시 확인할 케이스 |
|---|---|
| 배열/리스트 | 빈 배열, 원소 1개, 모두 같은 값 |
| 수열 | N=1, 음수, 0, 최대값 경계 |
| 문자열 | 빈 문자열, 한 글자, 특수문자 |
| 그래프 | 노드 1개, 간선 0개, 사이클 |
| 트리 | 리프만 있는 경우, 편향 트리 |
| 좌표/기하 | 같은 점, 일직선, 음수 좌표 |
| DP | base case, 최소 입력, 최대 입력 |
Step 8: Generate Improved Code
Create an improved version:
CRITICAL CONSTRAINTS:
- •Use ONLY Python builtin libraries
- •Maintain same I/O format
- •Preserve correctness
Allowed libraries:
import sys from collections import deque, Counter, defaultdict, OrderedDict from itertools import permutations, combinations, product, accumulate from functools import lru_cache, reduce from heapq import heappush, heappop, heapify from bisect import bisect_left, bisect_right, insort import math from string import ascii_lowercase, ascii_uppercase import re # if absolutely necessary
Step 9: Output Review to Terminal
IMPORTANT: Do NOT create any review files. Output the review directly to the terminal.
Output the following format directly as terminal text:
# Code Review: Baekjoon [NUMBER] ## 문제 정보 - **번호**: [NUMBER] - **유형**: [알고리즘 유형] - **난이도**: [실버/골드 등] - **시간 제한**: X초 - **메모리 제한**: X MB --- ## 원본 코드 ```python [original code]
복잡도 분석
시간 복잡도
| 구간 | 복잡도 | 설명 |
|---|---|---|
| 입력 처리 | O(...) | ... |
| 핵심 로직 | O(...) | ... |
| 전체 | O(...) | ... |
공간 복잡도
- •현재: O(...)
- •주요 메모리 사용: [변수명] - [크기]
제한 조건 통과 여부
- •N = [최대값] 일 때 예상 연산: [계산]
- •시간 제한 [X]초 내 통과: ✅/❌
- •메모리 제한 [X]MB 내 통과: ✅/❌
코드 리뷰
잘한 점
- •...
- •...
개선이 필요한 점
1. [문제점 제목]
현재 코드:
[problematic code snippet]
문제점: ...
개선 방법:
[improved code snippet]
2. [문제점 제목]
...
실수 체크리스트
- • 인덱스 범위 확인
- • 재귀 깊이 설정 필요
- • 입력 최적화 적용 ...
개선된 코드
""" Baekjoon [NUMBER] - [TITLE] Time: O(...), Space: O(...) """ import sys input = sys.stdin.readline [improved code with comments explaining key changes]
변경 사항 설명
| 변경 | Before | After | 효과 |
|---|---|---|---|
| 입력 최적화 | input() | sys.stdin.readline() | 10x 빠름 |
| ... | ... | ... | ... |
대안 접근법
접근법 1: [이름]
- •아이디어: ...
- •시간 복잡도: O(...)
- •공간 복잡도: O(...)
- •장점: ...
- •단점: ...
접근법 2: [이름]
...
관련 문제 & 학습 자료
비슷한 문제
이 문제에서 배울 점
- •핵심 개념: ...
- •테크닉: ...
- •주의할 점: ...
디버깅 가이드
틀렸습니다가 나오면 확인할 순서:
- • 예제 입력 직접 손으로 따라가기
- • 경계값 테스트 (N=1, N=최대)
- • 음수/0 처리 확인
- • 출력 형식 확인 (공백, 개행)
- • 정수 범위 확인 (int vs long long 해당 없음 in Python)
### Step 10: Summary
At the end, provide a brief summary:
- Key improvements identified
- Complexity comparison (before/after)
---
## Constraints
**CRITICAL - Improved code MUST:**
- Use ONLY Python builtin libraries
- Be compatible with BOJ Python3/PyPy3
- Handle same I/O format
- Be correct (same results as original)
- Include complexity comments
**NOT allowed:**
- numpy, pandas, scipy
- Any pip-installed packages
- External dependencies
---
## Quality Standards
### Good Review Includes:
- Specific line numbers when pointing out issues
- Before/After code comparisons
- Quantified improvements (e.g., "O(N²) → O(N log N)")
- Actionable suggestions
- Related problems for further practice
### Avoid:
- Vague feedback ("코드가 좋습니다")
- Over-engineering simple solutions
- Suggesting changes that don't improve correctness/performance
- Ignoring the problem's constraints
---
## Notes
- If original code is already optimal, acknowledge it clearly
- Focus on practical competitive programming improvements
- Explain WHY each change improves the code
- Consider both Python3 and PyPy3 when giving performance advice
- Link to similar problems for pattern recognition practice