Step 298. 국내 대회 예선 대비: 코드게이트/CCE 기출 풀이 — 기출은 최고의 교과서다
Level 3 — CTF 실전과 공격 스킬 심화 | 난이도 ★★★☆☆ | 예상 소요 시간 2일 (기출 수집·분석 반나절 + 풀이·특훈 계획 1일)
전제: Step 297의 시즌 2 계획 수립, Step 288의 유형 특훈 방법론, 완성된 익스플로잇 라이브러리.
- 준비물: 공개 기출 아카이브 접근(코드게이트·CCE 공개 저장소와 커뮤니티 Write-up), 기출 정리용 스프레드시트 또는 CSV, 파이썬 실행 환경, 예선 일정 메모. 기출 문제의 풀이 장면은 화면 예시이고, 경향 분석 스크립트는 여러분의 정리 데이터로 직접 돌리는 실측 도구입니다.
- ⚠️ 이 챕터의 실습은 내 랩·합법 플랫폼 전용입니다. 허가 없는 시스템에 적용하면 범죄입니다. 기출 문제는 주최 측이 학습용으로 공개한 아카이브만 사용하고, 대회 규정이 정한 기출 활용 범위(예: 대회 중 외부 자료 참조 금지 조항)를 확인합니다.
- 이 챕터는 대비 훈련입니다 — 새 개념보다, 국내 메이저 대회라는 구체적 무대의 결을 데이터로 파악하고 그에 맞춰 준비하는 법을 익힙니다.
주말 CTF를 10회 돌린 여러분의 다음 무대는 국내 메이저 대회입니다 — 코드게이트, CCE 같은 이름 있는 대회들. 이 대회들은 문제 스타일의 결국이 다릅니다. 실전 침해 시나리오를 재현한 문제, 한국적 소재, 그리고 예선-본선으로 나뉜 난도 곡선. 해외 주말 대회의 감각만으로 가면 "아는 것인데 안 풀리는" 경험을 합니다.
다행히 이 대회들은 매년 열렸고, 기출과 Write-up이 공개돼 있습니다. 예선 통과가 목표라면 기출이 최고의 교과서입니다 — 출제진의 손버릇이 그대로 담긴 문제집이니까요. 오늘은 기출을 수집해 풀고, 출제 경향을 표로 분석하고, 우리 팀 커버리지와 대조해 특훈 계획까지 뽑습니다.
1. 학습 목표
이 챕터를 끝내면 다음을 할 수 있습니다:
- 코드게이트·CCE의 공개 기출 아카이브에서 문제를 수집하고 목록을 구조화한다
- 국내 대회의 문제 스타일 특징(시나리오형, 예선 난이도 곡선)을 설명한다
- 기출을 분야·기법·해결 여부로 정리해 출제 경향 분석표를 만든다
- 팀 커버리지와 기출 유형을 대조해 "못 푸는 유형" 특훈 목록을 도출한다
- 예선 일정·형식(팀 구성, 시간, 규정)을 확인하고 등록을 준비한다
2. 배경 지식 — 오늘의 도구와 개념
오늘의 도구 한눈에 보기
| 구분 | 내용 |
|---|---|
| 언어·환경 | 파이썬 3(경향 분석), 스프레드시트/CSV(기출 목록), 지금까지의 전체 공격 도구 |
| 오늘의 명령 | python past_exam_analysis.py — 분야 비중·반복 기법·커버리지 분석 |
| 필요한 개념 | 기출 중심 대비, 출제 경향 분석, 유형 일반화, 예선 전략 |
| 오늘의 산출물 | 기출 정리표 + 경향 분석표 + 특훈 계획 + 예선 등록 체크리스트 |
2-1. 국내 메이저 대회의 결 — 무엇이 다른가
해외 주말 CTF와 국내 메이저 대회는 같은 종목의 다른 리그입니다. 대표적인 차이 세 가지.
| 축 | 해외 주말 CTF (지금까지의 무대) | 코드게이트·CCE (국내 메이저) |
|---|---|---|
| 문제 결 | 유형별 독립 문제 중심 | 실전 침해 시나리오 재현형 비중 높음 |
| 소재 | 영어권 밈·기술 스택 | 한국적 소재(국내 서비스·환경 패러디) |
| 구조 | 단일 라운드 24~48시간 | 예선(온라인) → 본선(오프라인) 분리 |
예선의 난이도 곡선도 특징입니다 — 본선 진출 팀을 가려내는 것이 목적이므로, 쉬운 문제와 어려운 문제의 간극이 넓고 중간 난이도에서 얼마나 빠르고 정확하게 먹는가가 합불을 가릅니다. 지금까지 훈련한 "쉬운 문제 속전속결 + Medium급 집중" 전술(Step 295)이 그대로 통하는 구조입니다 — 단, 문제의 결이 다르므로 그 결에 라이브러리를 맞춰야 합니다.
2-2. 기출 중심 대비 — 왜 기출인가
새 문제를 상상해서 준비하는 것은 확산이고, 기출로 준비하는 것은 수렴입니다. 출제진이 같으면 손버릇이 반복됩니다 — 선호하는 기법, 함정의 위치, 심지어 플래그 형식까지. 기출 16문제를 풀어 본 팀과 안 풀어 본 팀의 차이는 지식이 아니라 "이 대회의 문제가 무엇을 묻는지 아는가"입니다.
단, 기출에는 두 가지 주의가 있습니다. ① 수가 적습니다 — 연 2회 대회의 공개 기출은 유형당 몇 개뿐이니, 아껴 쓰되 푼 문제는 반드시 유형으로 일반화합니다. ② 과거의 결 ≠ 올해의 결 — 출제진이 바뀌면 경향도 바뀝니다. 기출은 예언서가 아니라 지형도입니다.
2-3. 기출 목록의 구조화 — 분석이 되려면 표여야 한다
기출을 "풀었다"에서 끝내면 안 됩니다. 분석 가능한 형태, 즉 표로 정리해야 경향이 보입니다. 한 문제당 한 행입니다.
대회 | 연도 | 분야 | 대표 기법 | 우리 팀 해결 여부
코드게이트 | 2025 | pwn | 스택 BOF + ROP | O
CCE | 2024 | crypto | AES 모드 오용 | X
...
이 표가 쌓이면 질문에 답할 수 있습니다 — 어느 분야가 자주 나오는가(비중), 어떤 기법이 반복되는가(빈도), 우리는 그중 무엇을 못 푸는가(커버리지). 세 질문이 곧 특훈 계획의 입력입니다.
2-4. 유형 일반화 — 기출 1개를 10개로 만드는 법
기출의 희소성을 극복하는 방법입니다. 기출 문제 1개를 풀면, 그 문제의 유형을 문장으로 일반화하고("힙 청크의 메타데이터를 덮어 인접 청크를 조작하는 유형"), 같은 유형의 문제를 외부 플랫폼(드림핵·pwnable 등)에서 찾아 추가 훈련합니다.
일반화의 공식:
1. 이 문제의 핵심 기법을 한 문장으로 (도구 이름이 아니라 구조로)
2. "이 기법이면 풀리는 다른 문제"의 특징 3가지
3. 그 특징으로 외부 플랫폼 검색 → 유사 문제 3~5개 추가 훈련
이렇게 하면 기출 16문제가 유형 교재 16권으로 불어납니다. 기출은 시금석이고, 일반화가 그 시금석으로 찾은 광맥입니다.
3. 따라 하기
3-1. 기출 수집 — 공개 아카이브에서
코드게이트와 CCE의 기출은 공개 채널에 있습니다 — 대회 공식 페이지의 아카이브, GitHub의 기출 모음 저장소(CTF-writeups 류), 참가자들의 Write-up 블로그. 수집 규칙 세 가지.
- 문제 파일과 Write-up을 분리해 저장합니다 — Write-up을 먼저 보면 문제가 죽습니다. 풀이에 쓸 것과 막혔을 때 참고할 것의 폴더를 나누세요.
- 원문을 그대로 보존합니다 — 파일명을 바꾸되 내용은 수정하지 않습니다. 기출의 가치는 원형에 있습니다.
- 최근 2~3개년 위주로 — 오래된 기출은 기술 스택이 달라 참고 가치가 떨어집니다.
3-2. 분야별 2~3개씩 풀이 — 타이머와 함께
수집한 기출에서 분야별로 2~3개씩 골라 풉니다. 이때 규칙이 있습니다 — 예선 시뮬레이션이 되도록 시간을 잰다. 여유로운 연습이 아니라, 예선에서 이 유형이 나왔을 때 "몇 시간 안에 먹을 수 있는가"를 재는 것이 목적입니다.
화면 예시 (기출 풀이 기록):
[코드게이트 2025 pwn — 스택 BOF + ROP]
착수 14:02 → checksec 확인(NX on, 카나리 없음) → 오프셋 40바이트 확정(14:25)
→ 라이브러리의 ROP 템플릿 적용 → 쉘 획득 14:47
소요 45분 / 판정: 예선 커트 가능권 — 템플릿이 20분을 아꼈다
[CCE 2024 crypto — AES 모드 오용]
착수 15:10 → ECB 오라클 의심했으나 CBC bit-flipping이 정답 → Write-up 참고(16:00)
→ 재현 완료 16:40 / 판정: 유형 미보유 — 특훈 목록행
읽는 법: 두 번째 기록이 기출 훈련의 존재 이유입니다 — 모르는 유형이 나왔을 때 Write-up을 보고 재현까지 가는 것. "읽고 이해"에서 멈추면 예선에서도 못 풉니다. 재현이 끝나면 2-4의 일반화로 이어집니다 — CBC bit-flipping 유형의 외부 유사 문제 3개가 추가 숙제가 됩니다.
3-3. 경향 분석 — 표에서 패턴을 읽는다
풀이가 쌓인 정리표를 스크립트에 넣어 경향을 뽑습니다. past_exam_analysis.py로 저장하세요.
# past_exam_analysis.py — 국내 대회 기출 경향 분석기
# PAST 목록을 우리 팀의 기출 정리 데이터로 교체해서 사용
from collections import Counter
# (대회, 연도, 분야, 대표 기법, 우리 팀 해결 여부)
PAST = [
("코드게이트", 2024, "pwn", "힙 청크 조작", False),
("코드게이트", 2024, "web", "SSRF", True),
("코드게이트", 2024, "rev", "안티 디버깅", False),
("코드게이트", 2024, "crypto", "RSA 공통 인수", True),
("코드게이트", 2025, "pwn", "스택 BOF + ROP", True),
("코드게이트", 2025, "web", "SSTI", True),
("코드게이트", 2025, "forensics", "메모리 덤프 분석", False),
("코드게이트", 2025, "misc", "OSINT", True),
("CCE", 2024, "pwn", "스택 BOF + ROP", True),
("CCE", 2024, "web", "파일 업로드 우회", True),
("CCE", 2024, "crypto", "AES 모드 오용", False),
("CCE", 2024, "rev", "패킹 언패킹", False),
("CCE", 2025, "pwn", "포맷 스트링", True),
("CCE", 2025, "web", "JWT 조작", True),
("CCE", 2025, "forensics", "네트워크 패킷 분석", True),
("CCE", 2025, "crypto", "RSA 공통 인수", True),
]
n = len(PAST)
cats = Counter(p[2] for p in PAST)
techs = Counter(p[3] for p in PAST)
print(f"기출 {n}문제 분석 (코드게이트·CCE 2024~2025)\n")
print("[분야 비중]")
for c, k in cats.most_common():
print(f" {c:<10} {k}문제 ({k/n*100:.0f}%)")
print("\n[반복 출제 기법 TOP 5]")
for t, k in techs.most_common(5):
print(f" {t}: {k}회")
unsolved = [p for p in PAST if not p[4]]
print(f"\n[팀 커버리지] 해결 {n-len(unsolved)}/{n} ({(n-len(unsolved))/n*100:.0f}%)")
print("[못 푼 유형 → 특훈 목록]")
for d, y, c, t, _ in unsolved:
print(f" {d} {y} | {c} | {t}")
실행 결과입니다 — 위 정리 데이터를 넣은 실측 출력입니다:
기출 16문제 분석 (코드게이트·CCE 2024~2025)
[분야 비중]
pwn 4문제 (25%)
web 4문제 (25%)
crypto 3문제 (19%)
rev 2문제 (12%)
forensics 2문제 (12%)
misc 1문제 (6%)
[반복 출제 기법 TOP 5]
RSA 공통 인수: 2회
스택 BOF + ROP: 2회
힙 청크 조작: 1회
SSRF: 1회
안티 디버깅: 1회
[팀 커버리지] 해결 11/16 (69%)
[못 푼 유형 → 특훈 목록]
코드게이트 2024 | pwn | 힙 청크 조작
코드게이트 2024 | rev | 안티 디버깅
코드게이트 2025 | forensics | 메모리 덤프 분석
CCE 2024 | crypto | AES 모드 오용
CCE 2024 | rev | 패킹 언패킹
읽는 법: 세 가지 결론이 나옵니다. ① 분야 비중에서 pwn·web이 50% — 예선의 절반을 차지하므로 이 두 분야의 담당이 예선의 승부처입니다. ② 반복 기법 — RSA 공통 인수와 스택 BOF+ROP가 두 번씩 출제. 반복되는 것은 올해도 나올 확률이 높은 유형이고, 다행히 둘 다 우리가 해결한 유형입니다(라이브러리에 있음). ③ 커버리지 69%와 특훈 목록 5건 — 이 목록이 예선까지의 특훈 계획 그 자체입니다. rev가 2문제 중 0개인 것도 주목 — 비중은 낮지만 완전 공백은 예선에서 "풀 수 있는 문제를 버리는" 사태를 만듭니다.
3-4. 특훈 계획 — 못 푼 유형의 우선순위
특훈 목록 5건을 전부 동시에 할 수는 없습니다(Step 295의 단일 목표 원칙). 우선순위의 기준은 두 가지 — 분야 비중 가중(pwn의 힙 청크 조작이 rev의 언패킹보다 급함)과 유형의 출제 연속성(최근 연도에도 나왔는가).
특훈 계획 (화면 예시):
1순위: 힙 청크 조작 (pwn 25% 비중 + 2024 출제) — 10문제 특훈, 담당 배정
2순위: AES 모드 오용 (crypto 반복 기법의 이웃) — ECB/CBC 오라클 묶어서 6문제
3순위: 메모리 덤프 분석 (forensics) — Volatility 기초 코스 + 기출 재현
보류: rev 2건 — 본선 목표로 미루고, 예선에서는 "기초 정적 분석까지"로 역할 한정
각 특훈은 Step 288의 형식을 따릅니다 — 유형 10문제, 치트시트 작성, 마지막에 새 문제 1개 타임어택 자가 테스트. 특훈의 산출물(치트시트)은 팀 라이브러리에 커밋해 자산화합니다.
3-5. 예선 등록 준비 — 규정이 전술이다
마지막으로 대회의 하드웨어를 확인합니다. 기술 준비만큼 규정 확인이 점수에 직결됩니다.
예선 준비 체크리스트 (화면 예시):
[ ] 예선 일시·진행 시간 (24시간? 36시간?) — 캘린더 등록, 팀원 일정 확정
[ ] 팀 구성 규정 — 인원 제한, 소속 제한, 중복 소속 금지 여부
[ ] 대회 중 규정 — 외부 자료 참조 범위, Write-up 공개 시점, 문제 서버 공격 금지 조항
[ ] 제출 방식 — 플래그 형식, 제출 횟수 제한, 동적 채점 여부
[ ] 계정·인프라 — 대회 플랫폼 사전 가입, VPN/환경 사전 테스트
[ ] 팀 등록 완료 — 마감 기한 확인, 확인 메일 보관
왜 규정이 전술인가: "제출 횟수 제한"이 있으면 막 제출이 금지되고, "동적 채점"이면 쉬운 문제부터 먹는 전술의 가치가 올라가고, "인원 제한 4명"이면 영입 논의(Step 296)의 답이 달라집니다. 규정을 아는 것도 실력입니다 — 예선에서 규정 몰라 손해 보는 팀이 매년 있습니다.
4. 미션과 연습문제
미션 — 기출 10문제 이상 풀이 + 경향 분석표
- 코드게이트·CCE의 공개 기출을 수집해 문제 파일과 Write-up을 분리 보관하고, 2-3의 구조(대회|연도|분야|기법|해결 여부)로 정리표를 만듭니다.
- 분야별 2~3개씩, 합계 10문제 이상을 시간을 재며 풀이합니다 — 모르는 유형은 Write-up 참고 후 반드시 재현합니다.
past_exam_analysis.py의PAST를 우리 정리 데이터로 교체해 실행하고, 분야 비중·반복 기법·커버리지를 확인합니다.- 못 푼 유형 목록에 우선순위(비중·연속성)를 매겨 특훈 계획을 세웁니다 — 각 유형은 2-4의 일반화로 외부 유사 문제까지 연결합니다.
- 예선 준비 체크리스트(3-5)를 우리 팀의 실제 정보로 채우고, 팀 등록을 완료합니다.
연습문제
문제 1. 국내 메이저 대회 예선의 난이도 곡선 특징(쉬운 문제와 어려운 문제의 넓은 간극)이 팀 전술에 요구하는 것은 무엇인가요? Step 295의 두 단계 전술과 연결해 답해 보세요.
문제 2. 기출 문제 수집 시 "문제 파일과 Write-up을 분리 보관"해야 하는 이유는 무엇인가요?
문제 3. 기출이 희소함에도 기출 중심 대비가 효과적인 이유를 "유형 일반화" 개념으로 설명해 보세요.
문제 4. 특훈 우선순위의 두 기준(분야 비중 가중·출제 연속성)을, 이 챕터의 실측 분석 결과에서 예를 들어 설명해 보세요.
5. 모범 답안과 완료 기준
미션 모범 답안
검증 기준으로 확인하세요.
- 정리표의 구조: 모든 기출 행에 대회·연도·분야·기법·해결 여부가 채워져 있는가 — 이 다섯 칸이 없으면 분석 스크립트의 입력이 안 됩니다.
- 풀이의 시간 기록: 각 문제에 착수·해결 시각과 "예선 커트 가능권" 판정이 있는가 — 시간을 재지 않은 기출 풀이는 시뮬레이션이 아닙니다.
- 재현의 증거: Write-up을 참고한 문제에 재현 기록(직접 끝까지 푼 로그)이 있는가.
- 분석의 완결: 스크립트 출력의 세 블록(비중·반복 기법·커버리지)이 회의에서 함께 읽혔는가.
- 특훈의 연결: 특훈 목록의 각 유형이 외부 플랫폼 유사 문제 3개 이상으로 확장됐는가 — 기출 1개가 유형 훈련으로 불어났는가.
- 등록의 완료: 체크리스트 6칸이 실제 정보로 채워지고 등록 확인 증거(메일 등)가 보관됐는가.
연습문제 해답
문제 1 해답. 중간 난이도 문제를 "빠르고 정확하게" 먹는 능력이 합불을 가르는 구조이므로, 전술은 기본 점수의 신속한 확보와 중간급 집중의 분리가 필요합니다 — 곧 Step 295의 두 단계 전술(쉬운 문제 4시간 속전속결 → Medium급 70% 투입)이 그대로 예선 전술이 됩니다. 간극이 넓다는 것은 어려운 문제에 매달려도 대부분의 팀이 못 푼다는 뜻이라, Hard 욕심을 버리고 중간급 완결에 화력을 모으는 판단이 중요합니다. 기출로 단련할 것도 바로 그 중간급의 속도와 정확도입니다.
문제 2 해답. Write-up을 먼저 보면 문제의 훈련 가치가 소멸하기 때문입니다. CTF 문제의 가치는 "입구를 스스로 찾는 과정"에 있는데, 답을 본 뒤의 풀이는 재현 연습일 뿐 탐색 훈련이 안 됩니다 — 기출 16개라는 적은 수에서는 한 문제의 낭비가 크게 느껴집니다. 분리 보관은 물리적 장치입니다 — 참고가 필요할 때(정해진 시간 초과 후)만 Write-up 폴더를 열도록 폴더 구조가 강제합니다. 규칙을 의지가 아니라 구조로 지키는 것입니다.
문제 3 해답. 기출은 수가 적지만 출제진의 손버릇이 담긴 유일한 표본이고, 일반화를 통해 부피를 키울 수 있기 때문입니다. 기출 1개를 풀고 핵심 기법을 구조로 문장화하면("힙 메타데이터 덮어쓰기로 인접 청크 조작"), 같은 구조의 문제를 외부 플랫폼에서 찾아 3~5개를 추가로 훈련할 수 있습니다. 이렇게 16개의 기출은 16개 유형의 교재가 되고, 각 유형은 실전 수의 연습 문제로 뒷받침됩니다. 기출의 역할은 문제은행이 아니라 "무엇을 연습할지 알려주는 지도"이고, 일반화가 그 지도를 실제 훈련량으로 변환합니다.
문제 4 해답. 분야 비중 가중의 예: 실측에서 pwn이 25%로 최다 비중이므로, 같은 미해결 유형이라도 "힙 청크 조작(pwn)"이 "안티 디버깅(rev 12%)"보다 우선됩니다 — 예선에서 마주칠 확률이 높으니까요. 출제 연속성의 예: "RSA 공통 인수"와 "스택 BOF+ROP"가 2024·2025에 걸쳐 반복 출제됐으므로 연속성이 높은 유형입니다(우리 팀은 둘 다 해결 가능 — 라이브러리 확인으로 방어 완료). 반대로 1회 출제에 그친 기법은 우선순위가 낮아집니다. 두 기준을 곱하면 5건의 특훈 목록이 순서 있는 계획이 됩니다.
완료 기준 체크리스트
- [ ] 기출을 수집하고 문제/Write-up을 분리 보관했다
- [ ] 기출 정리표(대회|연도|분야|기법|해결 여부)를 완성했다
- [ ] 기출 10문제 이상을 시간을 재며 풀이했다
- [ ] 모르는 유형은 Write-up 참고 후 재현까지 완료했다
- [ ] 경향 분석 스크립트를 우리 데이터로 실행해 비중·반복 기법·커버리지를 확인했다
- [ ] 못 푼 유형 특훈 계획(우선순위 포함)을 수립했다
- [ ] 각 특훈 유형을 외부 유사 문제로 일반화·확장했다
- [ ] 예선 준비 체크리스트를 채우고 팀 등록을 완료했다
6. 흔한 실수와 해결
벽 1. 기출 정리 CSV를 열었더니 인코딩 에러가 나요
증상: 엑셀에서 저장한 CSV를 파이썬으로 읽다가 이런 에러가 뜹니다.
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xba in position 0: invalid start byte
원인: 한글 윈도우의 엑셀은 CSV를 기본 CP949로 저장하는데, 파이썬의 기본 읽기 인코딩은 UTF-8입니다 (실측).
해결: 읽을 때 인코딩을 맞추세요 — Path("past.csv").read_text(encoding="cp949"). 근본적인 예방은 저장 단계에 있습니다 — 엑셀에서 "CSV UTF-8" 형식으로 저장하거나, 정리표를 처음부터 마크다운 표로 관리하는 것입니다. 팀 공유 문서라면 인코딩 이슈가 없는 마크다운이 낫습니다.
벽 2. 기출이 생각보다 너무 적어요 — 이걸로 대비가 되나요?
증상: 공개 기출이 연도·분야당 몇 개뿐입니다.
원인: 정상입니다 — 국내 대회의 공개 기출은 원래 적습니다. 그래서 2-4의 일반화가 있는 것입니다.
해결: 기출의 역할을 재정의하세요 — 문제은행이 아니라 출제 경향의 표본. 16문제면 분야 비중과 반복 기법을 읽기에 충분하고, 실제 훈련량은 일반화로 찾은 외부 유사 문제가 채웁니다. 그래도 부족하면 같은 출제진·유사 격의 다른 국내 대회(사이버공격방어대회 등) 기출로 표본을 넓히세요 — 단, 대회별 결의 차이는 정리표의 "대회" 열로 구분해 둡니다.
벽 3. Write-up을 봐도 재현이 안 돼요 — 환경이 없어요
증상: 기출 문제의 서버가 닫혀 있어 익스플로잇을 날려볼 곳이 없습니다.
원인: 기출 아카이브는 문제 파일만 남고 서비스는 내려간 경우가 많습니다.
해결: 세 갈래입니다. ① 문제 파일(바이너리·소스)이 있다면 로컬에 환경을 재구성하세요 — pwn 문제의 바이너리는 로컬에서도 뜹니다. ② 재구성이 불가하면 유형 재현으로 대체합니다 — 같은 기법의 외부 플랫폼 문제(드림핵 등)를 찾아 그것을 끝까지 풉니다. 기법의 손근육은 어디서 단련해도 같은 근육입니다. ③ 둘 다 안 되면 정적 분석이라도 끝까지 — "이 입력이 들어가면 여기서 터진다"를 코드로 확인하는 것만으로 절반의 훈련은 됩니다.
벽 4. 경향 분석을 했는데 "작년과 다른 출제진"이라는 공지가 떴어요
증상: 분석의 전제(출제진의 손버릇)가 흔들립니다.
원인: 출제진 교체는 실제로 일어납니다 — 2-2에서 경고했듯 기출은 예언서가 아니라 지형도입니다.
해결: 분석을 버리지 말고 가중치를 조정하세요. 최근 연도 기출의 비중을 올리고, 반복 기법보다 분야 비중(그 대회의 정체성은 출제진이 바뀌어도 잘 유지됩니다)을 더 신뢰합니다. 그리고 예선 초반 30분의 전 문제 훑기에서 "올해의 결"을 현장 확인합니다 — 지형도가 틀렸음을 대회 초반에 알아차리는 것도 기출 훈련이 준 감각입니다.
벽 5. 예선 준비에 매달려 정규 대회 사이클이 무너져요
증상: 특훈과 기출 분석에 빠져 주말 대회(#11) 참가를 건너뛰게 됩니다.
원인: 목표가 생기면 루틴이 밀립니다 — 그런데 대회 사이클이야말로 특훈의 검증 무대입니다.
해결: 주말 대회를 특훈의 시험장으로 쓰세요 — "이번 대회에서 힙 유형이 나오면 특훈 성과를 측정"하는 식으로 두 일정을 묶으면 충돌이 아니라 시너지가 됩니다. 예선 대비의 최종 점검은 Step 300의 실전 점검 대회가 담당하니, 사이클을 유지하는 것이 곧 예선 준비의 일부입니다. 루틴이 무너지는 순간, 우리가 10개 대회로 검증한 성장 엔진이 멈춥니다.
7. 정리
오늘의 개념
| 개념 | 한 줄 설명 |
|---|---|
| 국내 대회의 결 | 시나리오 재현형·한국적 소재·예선-본선 구조 — 같은 종목 다른 리그 |
| 기출 중심 대비 | 출제진의 손버릇이 담긴 유일한 표본으로 수렴 준비 |
| 기출 정리표 | 대회·연도·분야·기법·해결 여부 — 분석 가능한 형태의 조건 |
| 유형 일반화 | 기출 1개를 구조 문장으로 바꿔 외부 유사 문제로 확장 |
| 커버리지 대조 | 기출 유형 중 우리가 못 푸는 것의 목록 = 특훈 계획 |
| 규정이 전술 | 제한·형식·채점 방식이 전술의 입력값 |
오늘의 도구·명령어
| 도구·명령 | 하는 일 |
|---|---|
python past_exam_analysis.py |
분야 비중·반복 기법·커버리지·특훈 목록 출력 |
| 기출 분리 보관 | 문제 폴더 / Write-up 폴더 — 훈련 가치 보존 장치 |
| 예선 준비 체크리스트 | 일시·구성·규정·제출·인프라·등록의 6칸 |
| 특훈 계획 양식 | 우선순위(비중×연속성) + 유형별 문제 수 + 담당 |
| 일반화 3단 공식 | 기법 문장화 → 특징 3가지 → 외부 검색·확장 |
명령어보다 중요한 감각
해외 주말 대회 10회가 길러 준 것은 실력이고, 기출 분석이 길러 주는 것은 무대 적응력입니다 — "이 대회가 무엇을 묻는지 아는가"의 감각. 같은 실력도 무대를 아는 팀이 점수를 더 냅니다. 예선은 그 감각의 첫 시험장입니다.
그리고 잊지 마세요 — 기출 분석의 끝은 분석이 아니라 특훈이고, 특훈의 끝은 치트시트이고, 치트시트의 끝은 라이브러리 커밋입니다. 이 사슬이 돌아야 예선 당일의 여러분은 "처음 보는 문제"가 아니라 "어디선가 풀어 본 유형"을 마주하게 됩니다.
전부 체크되면 Step 298 완료입니다. 사이드바의 체크박스를 눌러 진도를 저장하세요.