AgentSkillsCN

Boj Review

Boj Review

SKILL.md

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_*.py or solution.py patterns
  • Sort by modification time (most recent first)

Step 2: Select File to Review

Use AskUserQuestion to confirm which file to review:

code
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_cacheDynamic Programming
heappush, heappop, heapqPriority Queue / Dijkstra
deque, popleft, BFS 패턴BFS
재귀 + 방문 체크DFS
sort 후 순차 처리Greedy
bisect, 이분 탐색 패턴Binary Search
union, find, 부모 배열Union-Find
비트 연산, 1 << nBitmask
문자열 해싱, KMP 패턴String Algorithm
세그먼트 트리, 펜윅 트리Range Query

Step 5: Deep Analysis

5.1 Complexity Analysis

code
## 복잡도 분석

### 시간 복잡도
- 현재: 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() 필요
    • 또는 반복문으로 변환 권장
</details> <details> <summary><b>Graph Algorithm Checklist</b></summary>
  • 그래프 표현 방식

    • 인접 리스트 vs 인접 행렬
    • 간선 수가 적으면 인접 리스트 권장
  • 방문 체크 타이밍

    • BFS: 큐에 넣을 때 방문 체크 (중복 방문 방지)
    • DFS: 방문할 때 체크해도 됨
  • 인덱스 일관성

    • 0-indexed vs 1-indexed 혼용하지 않기
    • 입력이 1-indexed면 그대로 사용하거나 변환 통일
  • 양방향 간선 처리

    • 무방향 그래프면 양쪽 모두 추가
    • graph[a].append(b) + graph[b].append(a)
  • 가중치 그래프 주의점

    • 음수 가중치: Dijkstra ❌, Bellman-Ford ✅
    • 모든 쌍 최단경로: Floyd-Warshall
</details> <details> <summary><b>Greedy Algorithm Checklist</b></summary>
  • 그리디 선택 속성 증명

    • 현재 최선의 선택이 전체 최적해를 보장하는가?
    • 반례가 존재하지 않는가?
  • 정렬 기준이 올바른가?

    • 여러 기준일 때 우선순위 확인
    • key=lambda x: (x[0], -x[1]) 패턴
  • 경계 조건 처리

    • 같은 값일 때 처리 방식
    • 빈 입력 처리
</details> <details> <summary><b>Binary Search Checklist</b></summary>
  • 탐색 범위 설정

    • left, right 초기값이 모든 가능한 답을 포함하는가?
    • 정수 범위: 오버플로우 주의
  • mid 계산

    • mid = (left + right) // 2 (오버플로우 안전)
    • mid = left + (right - left) // 2 (큰 수일 때)
  • 종료 조건

    • left <= right vs left < right
    • 무한 루프 방지: left, right가 반드시 수렴하는지
  • Parametric Search인 경우

    • 결정 함수가 단조성을 가지는가?
    • "X 이하로 가능한가?" → 이분 탐색 적용
</details> <details> <summary><b>Implementation / Simulation Checklist</b></summary>
  • 인덱스 경계 확인

    • 배열 범위 벗어나는 접근 없는지
    • 2D 배열: 행/열 순서 혼동 주의
  • 조건문 완전성

    • 모든 경우의 수 처리했는가?
    • else 케이스 누락 없는가?
  • 반복 종료 조건

    • 무한 루프 가능성 확인
    • 최대 반복 횟수 제한 필요한가?
</details>

5.3 Common Mistake Detection

반드시 확인해야 할 실수 패턴:

실수 유형확인 방법수정 방법
Off-by-one Errorrange(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 ≤ 1010! = 3.6MO(N!)완전 탐색, 순열
N ≤ 202^20 = 1MO(2^N)비트마스킹, 백트래킹
N ≤ 1001MO(N³)플로이드-워셜
N ≤ 3,0009MO(N²)단순 DP, 브루트포스
N ≤ 100,0001.7MO(N log N)정렬, 이분탐색, 세그트리
N ≤ 1,000,0001MO(N)선형 스캔, 해시
N ≤ 10^8100MO(N) 또는 O(1)수학적 공식

현재 코드가 제한 조건에서 통과 가능한지 판단:

  • 시간 제한 1초 ≈ 1억 연산
  • 시간 제한 2초 ≈ 2억 연산
  • PyPy3: Python3 대비 약 3~5배 빠름

Step 6: BOJ-Specific Optimization

필수 최적화 체크리스트:

python
# ❌ 느린 코드
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() + 단일 print5배+
리스트 생성for + append리스트 컴프리헨션2배
멤버십 테스트in listin setO(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개, 사이클
트리리프만 있는 경우, 편향 트리
좌표/기하같은 점, 일직선, 음수 좌표
DPbase 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:

python
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:

markdown
# Code Review: Baekjoon [NUMBER]

## 문제 정보
- **번호**: [NUMBER]
- **유형**: [알고리즘 유형]
- **난이도**: [실버/골드 등]
- **시간 제한**: X초
- **메모리 제한**: X MB

---

## 원본 코드

```python
[original code]

복잡도 분석

시간 복잡도

구간복잡도설명
입력 처리O(...)...
핵심 로직O(...)...
전체O(...)...

공간 복잡도

  • 현재: O(...)
  • 주요 메모리 사용: [변수명] - [크기]

제한 조건 통과 여부

  • N = [최대값] 일 때 예상 연산: [계산]
  • 시간 제한 [X]초 내 통과: ✅/❌
  • 메모리 제한 [X]MB 내 통과: ✅/❌

코드 리뷰

잘한 점

  1. ...
  2. ...

개선이 필요한 점

1. [문제점 제목]

현재 코드:

python
[problematic code snippet]

문제점: ...

개선 방법:

python
[improved code snippet]

2. [문제점 제목]

...


실수 체크리스트

  • 인덱스 범위 확인
  • 재귀 깊이 설정 필요
  • 입력 최적화 적용 ...

개선된 코드

python
"""
Baekjoon [NUMBER] - [TITLE]
Time: O(...), Space: O(...)
"""
import sys
input = sys.stdin.readline

[improved code with comments explaining key changes]

변경 사항 설명

변경BeforeAfter효과
입력 최적화input()sys.stdin.readline()10x 빠름
............

대안 접근법

접근법 1: [이름]

  • 아이디어: ...
  • 시간 복잡도: O(...)
  • 공간 복잡도: O(...)
  • 장점: ...
  • 단점: ...

접근법 2: [이름]

...


관련 문제 & 학습 자료

비슷한 문제

이 문제에서 배울 점

  1. 핵심 개념: ...
  2. 테크닉: ...
  3. 주의할 점: ...

디버깅 가이드

틀렸습니다가 나오면 확인할 순서:

  1. 예제 입력 직접 손으로 따라가기
  2. 경계값 테스트 (N=1, N=최대)
  3. 음수/0 처리 확인
  4. 출력 형식 확인 (공백, 개행)
  5. 정수 범위 확인 (int vs long long 해당 없음 in Python)
code

### 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