Step 336. 국내 대회 우승 도전 — 전력의 총결집: 24시간의 규율이 우승을 만든다
Level 4 — 전문가 | 난이도 ★★★★★ | 예상 소요 시간 2일 이상 (대회 전 2주 집중 훈련 + 대회 당일 완주 + 결과 기록)
전제: Step 324~326의 국내 대회 사이클, Step 327의 격차 분석과 보완 계획, Step 328의 국제 대회 경험. 이번에는 목표가 다릅니다 — 경험이 아니라 우승입니다.
- 준비물: 목표 국내 대회 1개(코드게이트·CCE 등 메이저), 최정예 팀, 검증된 팀 운영 규칙, 축적된 익스플로잇 라이브러리, 파이썬 실행 환경(라이브러리 점검기). 라이브러리 점검 스크립트는 여러분의 폴더에서 돌리는 실측 도구이고, 대회 장면과 스코어보드는 전부 화면 예시입니다.
- 주의: 외부 CTF 플랫폼·대회 서버에 여기서 접속하지 않습니다 — 대회 진행 장면은 전부 화면 예시로 작성돼 있으며, 실제 출전은 여러분이 대회 일정에 맞춰 수행하는 과제입니다.
- ⚠️ 이 챕터의 실습은 내 랩·합법 플랫폼 전용입니다. 허가 없는 시스템에 적용하면 범죄입니다. 대회 규정(팀 인원 상한, 외부 협업 금지, 도구 제한)을 시작 전에 읽고 지킵니다.
지금까지의 대회에서 여러분의 목표는 "경험과 학습"이었습니다 — 첫 대회는 완주, 본선은 계획 실행, 국제 대회는 세계의 천장 확인. 그런데 오늘부터 목표가 바뀝니다. 우승입니다. 목표가 바뀌면 준비의 성격이 바뀝니다 — "내가 성장하는가"가 아니라 "우리 팀이 가장 많은 점수를 얻는가"가 유일한 질문이 됩니다.
소재 원문의 진단은 명확합니다. 우승은 개인 실력의 합이 아니라 팀 전력의 최적화에서 나옵니다 — 분야가 겹치지 않는 최정예 멤버, 검증된 운영 규칙, 축적된 익스플로잇 라이브러리, 대회 전 집중 훈련. 오늘은 그 네 자산을 총결집하는 절차를 정리합니다.
1. 학습 목표
이 챕터를 끝내면 다음을 할 수 있습니다:
- 팀 전력을 분야별로 최종 점검하고 약점 분야의 보강 여부를 판단한다
- 대회 전 2주 집중 훈련(팀 단위 모의 CTF, 라이브러리 점검)을 설계하고 실행한다
- 라이브러리 점검 스크립트로 분야별 준비 상태를 수치로 확인한다
- 운영 규칙(열거·인수인계·스코어보드·식사)을 재확인하고 대회 내내 집행한다
- 우승 압박을 관리하는 팀 합의 문장을 만들고, 결과를 기록한다
2. 배경 지식 — 오늘의 도구와 개념
오늘의 도구 한눈에 보기
| 구분 | 내용 |
|---|---|
| 언어·환경 | 파이썬 3(라이브러리 점검), 팀 익스플로잇 라이브러리, 팀 채널, 대회 플랫폼 |
| 오늘의 명령 | python step336_lib_audit.py <라이브러리 폴더> — 분야별 준비 상태 점검 |
| 필요한 개념 | 전력 최적화, 2주 집중 훈련 사이클, 운영 규칙 집행, 우승 압박 관리 |
| 오늘의 산출물 | 팀 전력 점검표 + 2주 훈련 계획 + 라이브러리 점검 결과 + 대회 결과 기록 |
2-1. 우승의 산수 — 합이 아니라 곱
학습 목표의 대회와 우승 목표의 대회는 점수의 구조가 다릅니다. 학습의 대회에서는 한 분야가 0점이어도 다른 분야의 점수가 의미를 가집니다 — 배움이 남으니까요. 우승의 대회에서는 다릅니다. 상위권 싸움에서 우승팀과 2위 팀의 차이는 대개 한두 문제이고, 그 한두 문제는 대부분 한 팀의 0솔브 분야에서 나옵니다.
그래서 우승 도전의 첫 작업은 강점 강화가 아니라 약점의 존재 여부 확인입니다. web·pwn·rev·crypto·forensics 중 우리 팀이 "나오면 멈추는" 분야가 하나라도 있으면, 그 대회의 우승 확률은 그 분야 문제의 출제 여부에 걸립니다 — 실력이 아니라 운에. 전력 최적화란 이 운의 영역을 없애는 작업입니다.
2-2. 최정예 팀의 조건 — 겹치지 않는 분야
우승을 노리는 팀 구성의 규칙은 하나입니다 — 분야가 겹치지 않는 것. web 최강자 두 명보다 web과 crypto의 1인자 조합이 강합니다. 같은 2명이라도 커버하는 분야가 다르면 팀의 총 커버리지가 넓어지고, 커버리지가 곧 예상 점수입니다.
팀 전력 점검의 질문은 세 가지입니다. ① 분야별 담당이 명확한가 — "다 같이 본다"는 담당이 없는 상태입니다. ② 약점 분야의 보강은 됐는가 — 보강이 안 됐다면 그 분야의 출제 시 운영 계획(빠른 포기 판단, 시간 상한)이 있는가. ③ 팀원의 컨디션은 대회 날짜에 맞춰 관리되고 있는가 — 개인 사정으로 대회 당일 50% 컨디션인 팀원은 시작 전에 알아야 전력 계산이 됩니다.
2-3. 2주 집중 훈련 — 시뮬레이션의 복원력
대회 직전 2주의 훈련은 평소 훈련과 목적이 다릅니다. 새 기법을 배우는 기간이 아니라, 가진 것을 대회 조건에서 꺼내 쓰는 연습의 기간입니다. 구성은 두 축입니다.
| 축 | 내용 | 빈도 |
|---|---|---|
| 팀 단위 모의 CTF | 기출 세트로 시간을 재고 실전 운영 규칙 그대로 | 2주간 1~2회 |
| 라이브러리·체크리스트 점검 | 템플릿 실행 확인, README 갱신, 미비 분야 보강 | 주 2~3회, 짧게 |
모의 CTF의 가치는 문제 풀이가 아니라 운영의 리허설에 있습니다 — 열거 순서, 인수인계 문서, 회의 시각, 식사 타이밍이 실전처럼 돌아가는지 확인하는 것. 대회 당일에 처음 돌리는 규칙은 규칙이 아니라 희망입니다.
2-4. 우승 압박 — 평소 실력을 막는 것
우승을 목표로 하는 순간 새로운 적이 생깁니다 — 압박입니다. "이번에는 이겨야 한다"는 생각이 평소에 하던 판단을 흔듭니다. 쉬운 문제에서도 확인을 반복하고, 정체 구간에서 계획 없는 전환을 하고, 스코어보드를 지나치게 자주 봅니다.
소재 원문의 처방은 팀이 함께 새기는 한 문장입니다 — "이 대회 하나가 인생을 결정하지 않는다." 우습게 들리지만 이 문장이 하는 일이 있습니다. 압박의 본질은 "이 순간의 비중을 과대평가하는 것"이고, 이 문장은 그 비중을 정정합니다. 최선의 훈련을 했다면 남은 것은 실행뿐이고, 실행은 압박이 아니라 규칙이 담당합니다. 우승은 한 문제의 천재가 아니라 24시간의 규율이 만든다 — 이 문장이 오늘의 축입니다.
3. 따라 하기
3-1. 팀 전력 최종 점검 — 표로 쓰면 공백이 보인다
대회 2주 전, 팀 전력 점검표를 작성합니다. 기억이 아니라 표로 쓰는 순간 공백이 보입니다.
■ 팀 전력 점검표 (화면 예시):
| 분야 | 주담당 | 부담당 | 최근 대회 솔브 여부 | 상태 평가 |
|-----------|--------|--------|----------------------|-----------|
| web | A | C | 최근 3회 모두 솔브 | 강함 |
| pwn | B | — | 3회 중 2회 | 양호 |
| rev | C | A | 3회 중 2회 | 양호 |
| crypto | B | — | 3회 중 1회 (기본만) | 약점 |
| forensics | A | — | 3회 중 3회 | 강함 |
판정: crypto가 0솔브 위험 분야 → 보강 불가 시 "crypto 시간 상한 2시간" 운영 규칙 추가
컨디션: 전원 대회 주간 야근·시험 없음 확인 (B는 금요일 저녁까지 근무 — 첫 2시간 커버 계획)
읽는 법: 세 가지를 확인합니다. ① 부담당이 비어 있는 분야 — 주담당의 컨디션 난조가 곧 그 분야의 사망을 뜻하는 구조가 보입니다. ② 약점 분야의 처리 — 보강 기간이 부족하면 운영 규칙(시간 상한)으로 리스크를 가둡니다. ③ 컨디션의 사전 파악 — 당일에 알면 전략 수정이고, 미리 알면 전략입니다.
3-2. 라이브러리 점검 — 무기고의 실전 검증
축적된 익스플로잇 라이브러리는 우승 도전의 탄약입니다. 그런데 "있다"와 "꺼내 쓸 수 있다"는 다릅니다. 대회 2주 전에 점검 스크립트를 돌립니다. step336_lib_audit.py로 저장하세요.
# step336_lib_audit.py — 팀 익스플로잇 라이브러리 대회 전 점검기
# 사용: python step336_lib_audit.py <라이브러리 폴더>
# 점검: 분야별 템플릿 존재, README 존재, 90일 이상 미갱신 경고
import sys
import time
from pathlib import Path
FIELDS = ["web", "pwn", "rev", "crypto", "forensics", "misc"]
STALE_DAYS = 90
def main():
root = Path(sys.argv[1])
now = time.time()
print("=== 팀 라이브러리 대회 전 점검 ===")
print(f"기준: README 필수, 최근 갱신 {STALE_DAYS}일 이내\n")
ok, warn = 0, 0
for field in FIELDS:
d = root / field
if not d.is_dir():
print(f"[결손] {field}/ — 폴더 자체가 없습니다. 대회 전 채워야 합니다.")
warn += 1
continue
files = sorted(p for p in d.iterdir() if p.is_file())
has_readme = any(p.name.lower() == "readme.md" for p in files)
newest = max((p.stat().st_mtime for p in files), default=0)
age = (now - newest) / 86400
state = []
if not has_readme:
state.append("README 없음")
if age > STALE_DAYS:
state.append(f"최신 파일이 {age:.0f}일 전 — 최근 기법 반영 확인 필요")
if state:
warn += 1
print(f"[주의] {field}/ ({len(files)}개 파일) — " + "; ".join(state))
else:
ok += 1
print(f"[통과] {field}/ ({len(files)}개 파일) — README 있음, 최신 {age:.0f}일 전")
print(f"\n결과: {len(FIELDS)}개 분야 중 통과 {ok}, 주의·결손 {warn}")
print("주의 1개라도 있으면 대회 전 주말이 보강 기간입니다.")
if __name__ == "__main__":
main()
샘플 라이브러리 폴더(일부러 결함을 심어 둠 — forensics의 README 삭제, crypto를 120일 전으로 시침)에 대고 실행한 실측 출력입니다:
=== 팀 라이브러리 대회 전 점검 ===
기준: README 필수, 최근 갱신 90일 이내
[통과] web/ (3개 파일) — README 있음, 최신 0일 전
[통과] pwn/ (3개 파일) — README 있음, 최신 0일 전
[통과] rev/ (2개 파일) — README 있음, 최신 0일 전
[주의] crypto/ (2개 파일) — 최신 파일이 120일 전 — 최근 기법 반영 확인 필요
[주의] forensics/ (1개 파일) — README 없음
[통과] misc/ (2개 파일) — README 있음, 최신 0일 전
결과: 6개 분야 중 통과 4, 주의·결손 2
주의 1개라도 있으면 대회 전 주말이 보강 기간입니다.
읽는 법: 두 종류의 경고를 구분합니다. ① "README 없음"은 사용성 결함 — 대회 중 남의 템플릿을 꺼내 쓸 때 README가 없으면 그 파일은 없는 것과 같습니다. 남의 머리에 있는 사용법은 대회 중에 전송되지 않습니다. ② "120일 전"은 신선도 경고 — crypto처럼 프레임워크 갱신이 빠른 분야는 석 달이면 솔버가 깨지는 일이 흔합니다. 점검이 끝나면 경고 항목이 곧 2주 훈련의 보강 목록이 됩니다. 여러분의 실제 라이브러리에서 돌려 보세요 — 여기서 경고가 0건이 나올 때까지가 대회 전 작업입니다.
3-3. 2주 집중 훈련 — 모의 CTF로 운영을 리허설
2-3의 두 축을 달력에 배치합니다. 화면 예시로 본 2주 계획입니다:
■ 대회 전 2주 훈련 계획 (화면 예시):
[1주차]
- 월: 라이브러리 점검 결과 보강 — crypto 솔버 갱신, forensics README 작성
- 수: 팀 모의 CTF #1 — 작년 기출 세트, 4시간 타임어택, 실전 운영 규칙 그대로
- 금: 모의 CTF #1 복기 — 규칙 위반 사례 2건 발견 (열거 생략, 인수인계 구두)
- 토: 약점 분야(crypto) 기출 3문제 집중 세션
[2주차]
- 화: 모의 CTF #2 — 다른 연도 기출, 이번엔 대회 시간대와 동일하게 야간 개시
- 목: 모의 CTF #2 복기 — 규칙 준수 확인, crypto 상한 규칙의 효과 검증
- 토: 최종 점검 — 장비, 계정, 컨디션 계획. 이후 새 작업 금지
읽는 법: 이 계획의 본질은 "복기"가 "모의 CTF"만큼 자리를 차지한다는 점입니다. 모의 CTF는 규칙의 시험대이고, 복기는 규칙의 개정 회의입니다. #1에서 발견된 위반 2건이 #2에서 사라졌는지 확인하는 것 — 그것이 리허설의 완료 조건입니다. 그리고 마지막 토요일의 "새 작업 금지"가 중요합니다 — 대회 전날까지 새 기법을 배우려다 컨디션을 태우는 것이 상위권 팀의 고전적 자멸 패턴입니다.
3-4. 출전 — 계획된 운영을 끝까지 신뢰한다
대회 당일의 운영은 Step 326의 골격을 계승하되, 목표가 우승이므로 한 가지가 강화됩니다 — 중반 이후의 스코어보드 대응입니다. 우승 싸움에서는 1~3위가 점수 차로 붙어 있고, 이 구간에서의 판단이 순위를 가릅니다.
■ 우승 도전 대회 진행 기록 (화면 예시):
[00:00] 시작. 전 문제 열거 35분 — 14문제. 분야별 담당 즉시 착수
[01:30] web warmup·forensics 해결 (+350). 이상적 출발
[04:00] 1차 회의 — 1위와 50점 차 2위. 계획 유지. 스코어보드 확인 종료
[06:00] crypto 고난도 정체 — 시간 상한 규칙 발동 대기 중
[08:00] crypto 상한 도달 → 포기, 시도 내역 저장. pwn 중급으로 전환
[10:00] pwn 해결 (+400) — 1위 팀이 아직 못 푼 문제. 역전, 1위
[14:00] 2차 회의 — 2위와 150점 차. 남은 문제 3개: crypto 1, rev 1, misc 1
[18:00] rev 해결 (+350). misc는 출제 의도 파악 중
[21:00] misc 해결 (+200). 남은 것은 crypto 고난도뿐 — 우승팀도 정체 확인
[23:30] crypto 재도전 90분 무진전 — 규칙대로 기록 정리로 전환
[24:00] 종료. 최종 1,650점. 우승 — 2위와 150점 차
읽는 법: 우승을 만든 세 장면을 봅니다. ① 08:00의 crypto 포기 — 우승팀은 "한 문제를 끝까지 붙잡는 팀"이 아니라 "포기 규칙을 지키는 팀"이었습니다. 그 2시간이 pwn +400점으로 돌아왔습니다. ② 10:00의 역전 — 상대가 못 푼 문제를 푼 것이 1위의 근거이고, 그건 3-1의 커버리지 점검 덕입니다. ③ 21:00~23:30 — 남은 한 문제가 우승팀에게도 정체였습니다. 우승은 "모든 문제를 푸는 것"이 아니라 "풀 수 있는 문제를 전부 회수하는 것"이었습니다.
3-5. 결과 기록 — 승리의 데이터화
종료 후의 기록은 패배했을 때만 하는 것이 아닙니다. 이겼을 때의 기록이 더 섬세해야 합니다 — 이유가 다음 챕터(Step 337)의 주제이기 때문입니다.
■ 결과 기록 양식 (화면 예시):
- 최종 순위 / 점수 / 2위와의 차이:
- 문제별: 푼 문제(소요 시간, 결정적 단서) / 못 푼 문제(막힌 지점)
- 운영 평가: 규칙별 준수 여부 — 특히 포기 규칙과 스코어보드 규칙
- 승인 후보(이긴 이유): 실력 요인과 운 요인을 분리해서 — 정직하게
- 팀 소감 회의 15분: "이긴 것 중 재현 가능한 것" 목록
마지막 항목이 핵심입니다 — "재현 가능한가"의 분리. 커버리지 덕에 이긴 것은 재현 가능하고, 마지막 문제의 출제 방향이 운 좋게 우리 경험과 겹친 것은 재현 불가능합니다. 이 분리가 안 되면 우승은 다음 대회의 전략이 아니라 자신감의 착시가 됩니다.
4. 미션과 연습문제
미션 — 최정예 팀의 우승 도전
- 3-1의 양식으로 팀 전력 점검표를 작성합니다 — 부담당 공백과 약점 분야의 처리 방침을 포함합니다.
step336_lib_audit.py로 팀 라이브러리를 점검하고, 경고 항목을 2주 훈련의 보강 목록으로 변환합니다.- 3-3의 구조로 2주 훈련을 실행합니다 — 모의 CTF 1~2회와 각각의 복기, 규칙 위반의 추적.
- 대회에 출전해 계획된 운영(열거·인수인계·포기 규칙·스코어보드 규칙)을 끝까지 집행합니다 — 팀 합의 문장("이 대회 하나가…")을 시작 전에 소리 내어 확인합니다.
- 3-5의 양식으로 결과를 기록합니다 — 이겼다면 승인을 실력/운으로 분리해서.
연습문제
문제 1. 학습 목표의 대회와 우승 목표의 대회에서 "0솔브 분야"의 의미가 어떻게 다른지, 점수 구조의 관점에서 설명해 보세요.
문제 2. "분야가 겹치지 않는 최정예"가 "같은 분야의 최강자 둘"보다 강한 이유를, 팀 커버리지와 예상 점수의 개념으로 설명해 보세요.
문제 3. 3-3에서 모의 CTF만큼 복기에 시간을 배정한 이유는 무엇인가요? "리허설의 완료 조건"이라는 관점에서 답해 보세요.
문제 4. 3-4 화면 예시에서 08:00의 crypto 포기가 왜 패배가 아니라 우승의 수단이었는지, 그리고 그 판단이 가능했던 사전 장치 두 가지를 설명해 보세요.
5. 모범 답안과 완료 기준
미션 모범 답안
검증 기준으로 확인하세요.
- 전력 점검표의 완결성: 전 분야에 주담당이 있고, 부담당 공백과 약점 분야가 "처리 방침"과 함께 명시됐는가 — 빈 칸 없이.
- 라이브러리 점검의 실행: 스크립트 출력이 남아 있고, 경고 항목이 훈련 계획의 보강 작업으로 연결됐는가 — 점검과 훈련이 분리돼 있으면 점검은 의식입니다.
- 리허설의 증거: 모의 CTF의 복기에서 발견된 규칙 위반이 다음 모의 CTF에서 개선됐는지의 추적 기록이 있는가.
- 규칙 집행의 증거: 대회 로그에 포기 규칙·스코어보드 규칙의 실제 발동 시각이 기록됐는가.
- 결과 기록의 정직성: 이겼다면 승인이 실력/운으로 분리됐고, 졌다면 패인이 문제별로 특정됐는가 — "아쉬웠다"는 기록이 아닙니다.
연습문제 해답
문제 1 해답. 학습 목표의 대회에서 0솔브 분야는 "다음 훈련의 좌표"입니다 — 다른 분야의 점수와 배움이 남으므로 대회는 성공일 수 있습니다. 우승 목표의 대회에서 0솔브 분야는 "우승 확률의 운 요소"입니다 — 상위권의 점수 차는 한두 문제이므로, 그 분야의 문제가 출제되는 순간 우승 여부가 실력이 아니라 출제 방향의 운에 걸립니다. 같은 0솔브가 전자에서는 정보, 후자에서는 리스크입니다. 전력 최적화란 이 리스크를 보강 또는 운영 규칙(시간 상한)으로 제거하는 작업이고, 그것이 우승 도전의 준비가 학습 대회의 준비와 다른 지점입니다.
문제 2 해답. 팀의 예상 점수는 "출제된 문제 중 우리가 풀 수 있는 문제의 비율"에 비례하고, 그 비율은 팀의 분야 커버리지가 결정합니다. web 최강자 둘은 web 문제를 빨리 풀지만 커버리지는 web 하나뿐이라, crypto가 나오는 대회에서는 둘째 사람이 관전자가 됩니다. 반면 web 1인자 + crypto 1인자는 각자의 분야에서 최고가 아니어도 커버리지가 두 배입니다. CTF의 문제는 분야를 골고루 출제하므로, 상위권 싸움에서는 최고의 깊이보다 공백 없는 넓이가 예상 점수를 높입니다. 최정예의 "정예"는 개인 랭킹의 합이 아니라 커버리지의 완성도를 뜻합니다.
문제 3 해답. 모의 CTF는 규칙의 시험이고 복기는 규칙의 개정이기 때문입니다. 모의 CTF만 하고 복기를 생략하면, 열거 생략이나 구두 인수인계 같은 위반이 발견되지 않은 채 실전에 그대로 이식됩니다 — 리허설의 목적은 연습이 아니라 결함의 사전 노출입니다. 리허설의 완료 조건은 "N회 했다"가 아니라 "1회차에서 발견된 위반이 2회차에서 사라졌다"의 확인입니다. 그 추적이 있어야 대회 당일의 규칙은 희망이 아니라 검증된 절차가 됩니다.
문제 4 해답. 포기가 우승의 수단이었던 이유 — crypto 고난도에 남은 시간을 태웠다면 pwn +400점과 rev +350점의 회수 기회가 사라졌고, 실제로 우승팀도 그 crypto 문제를 못 풀었습니다. 포기된 2시간이 750점으로 돌아왔으니, 포기는 패배가 아니라 점수의 이동이었습니다. 이 판단을 가능하게 한 사전 장치 두 가지는 ① 3-1에서 합의한 "crypto 시간 상한 2시간" 규칙 — 당일의 판단이 아니라 사전의 합의가 집행된 것, ② 시도 내역 저장의 습관 — 포기를 "삭제"가 아니라 "보류"로 만들어 심리적 저항을 낮춘 것. 압박 상황의 판단 품질은 그날의 의지가 아니라 사전 장치의 개수로 결정됩니다.
완료 기준 체크리스트
- [ ] 팀 전력 점검표를 작성하고 약점 분야의 처리 방침(보강 또는 시간 상한)을 정했다
- [ ] 라이브러리 점검 스크립트를 실행하고 경고 항목을 보강 목록으로 변환했다
- [ ] 2주 훈련 계획을 달력에 배치했다 (모의 CTF 1~2회 + 각 복기 + 최종 점검)
- [ ] 모의 CTF에서 실전 운영 규칙을 그대로 집행하고 위반을 복기에서 추적했다
- [ ] 대회 시작 전 팀 합의 문장("이 대회 하나가 인생을 결정하지 않는다")을 확인했다
- [ ] 대회에서 포기 규칙·스코어보드 규칙을 실제로 집행했다
- [ ] 결과 기록을 양식대로 완성했다 — 승인(또는 패인)의 실력/운 분리 포함
- [ ] 입상 이상 또는 팀 최고 성적을 기록했다
6. 흔한 실수와 해결
벽 1. 점검 스크립트를 실행하니 인자 에러가 나요
증상:
root = Path(sys.argv[1])
~~~~~~~~^^^
IndexError: list index out of range
원인: 라이브러리 폴더 경로를 인자로 안 줬습니다 (실측).
해결: python step336_lib_audit.py ~/team-lib 형식으로 실행하세요. 팀 라이브러리가 Git 저장소라면 로컬 클론 위치를 가리키면 됩니다. 분야 폴더 이름이 다르면 스크립트의 FIELDS 목록을 팀 규칙에 맞게 수정하세요 — 그 수정 자체가 팀의 분야 체계를 문서화하는 일입니다.
벽 2. 모의 CTF를 하려는데 팀원 일정이 안 맞아요
증상: 2주 안에 전원이 모이는 4시간이 두 번 잡히지 않습니다.
원인: 상위권 팀일수록 구성원이 바쁩니다 — 흔한 일입니다.
해결: 세 가지 조정이 있습니다. ① 분할 실행 — 4시간 1회 대신 2시간 2회로 쪼개고, 운영 규칙 리허설에 집중합니다(문제 수를 줄여도 규칙의 시험은 가능합니다). ② 비동기 리허설 — 인수인계 문서와 열거 양식 같은 "문서 류" 규칙은 시간을 공유하지 않고도 검증됩니다. ③ 우선순위 — 둘째 모의 CTF를 포기하더라도 라이브러리 점검과 복기 회의는 지킵니다. 운영의 검증이 문제 수의 검증보다 우승에 가깝습니다.
벽 3. 대회 중반, 1위와 점수 차가 벌어지며 팀 분위기가 급해져요
증상: 계획에 없던 문제로 팀원이 이탈하고, 포기 규칙이 무시되기 시작합니다.
원인: 우승 압박이 규칙을 녹이는 전형적 순간입니다 — "지금 무언가 해야 한다"는 충동이 "계획된 것을 계속한다"를 이깁니다.
해결: 사전 장치는 3-4에서 확인한 팀 합의 문장입니다 — 시작 전에 소리 내어 합의했어야 그 순간에 인용할 수 있습니다. 당장의 대응은 회의 소집입니다 — 스코어보드 확인은 회의 시간이라는 규칙에 근거해 15분 회의를 열고, 질문은 하나입니다: "계획을 바꿀 근거가 새 정보에 있는가, 감정에 있는가." 새 정보라면 계획을 고치고, 감정이라면 계획을 계속합니다. 이 구분을 회의에서 소리 내어 묻는 것 자체가 압박의 해독입니다.
벽 4. 우승 압박 때문에 전날 잠을 못 잤어요
증상: 평소 실력의 70%도 안 나오는 컨디션으로 시작합니다.
원인: 컨디션 관리(Step 326의 2-3)가 우승 도전에서는 더 엄격해야 하는데, 오히려 압박이 수면을 먼저 침범합니다.
해결: 수면을 "대회 준비의 마지막 항목"이 아니라 "대회 전력의 일부"로 재분류하세요 — 3-3의 계획표에 취침 시각이 명시되는 이유입니다. 잠이 안 오는 밤의 대응은 미리 정해 둡니다 — 규칙은 "누워 있는 것"이지 "자는 것"이 아닙니다. 못 자도 눈을 감고 누워 있으면 회복의 상당 부분이 확보되고, "못 잤다"는 사실 자체에 대한 불안을 팀에 공유해 담당 배정에 반영합니다. 숨기는 불면이 팀을 해치지, 공유된 불면은 운영 변수일 뿐입니다.
벽 5. 졌어요 — 입상도 못 했어요. 우승 도전이 무모했나요?
증상: 전력을 총결집했는데 결과가 목표에 못 미치고, 팀의 사기가 떨어집니다.
원인: 우승은 확률의 목표입니다 — 최상의 준비가 확률을 올리지, 보장하지 않습니다. 그리고 "졌다"는 사실에는 분석 가치가 있습니다 — 이긴 대회보다 진 대회가 더 많은 데이터를 줍니다.
해결: 두 가지를 분리하세요. ① 준비의 평가 — 점검표·훈련·규칙 집행이 계획대로 됐다면, 그 준비는 성공입니다. 결과와 준비를 한 바구니로 평가하면 다음 준비의 동력이 꺾입니다. ② 결과의 분석 — 3-5의 기록이 준비됐다면, 다음 챕터(Step 337)의 승패 분석이 그 기록을 다음 도전의 설계도로 바꿉니다. 소재 원문의 문장대로, 최선의 훈련을 했다면 남은 건 실행이었고, 실행의 결과는 데이터입니다. 데이터는 이기든 지든 수확입니다.
7. 정리
오늘의 개념
| 개념 | 한 줄 설명 |
|---|---|
| 우승의 산수 | 상위권의 차이는 한두 문제 — 0솔브 분야가 운의 영역 |
| 전력 최적화 | 커버리지의 완성도 — 공백 없는 넓이가 최고의 깊이를 이긴다 |
| 2주 집중 훈련 | 새 기법이 아니라 운영의 리허설 — 복기가 완료 조건 |
| 라이브러리 점검 | "있다"와 "꺼내 쓸 수 있다"의 검증 — README와 신선도 |
| 우승 압박 관리 | 비중의 정정 — 팀 합의 문장 + 회의에서의 정보/감정 구분 |
| 승인의 분리 | 재현 가능한 실력 요인과 운 요인을 나눠 기록한다 |
오늘의 도구·명령어
| 도구·명령 | 하는 일 |
|---|---|
python step336_lib_audit.py <폴더> |
분야별 README·신선도·파일 수 점검 — 보강 목록 도출 |
| 팀 전력 점검표 | 주/부담당·최근 솔브·컨디션의 한 장 요약 |
| 2주 훈련 계획표 | 모의 CTF + 복기 + 약점 세션 + 최종 점검의 배치 |
| 시간 상한 규칙 | 약점 분야의 리스크를 가두는 사전 합의 |
| 결과 기록 양식 | 순위·문제별·운영 평가·승인 분리·소감 회의 |
명령어보다 중요한 감각
오늘 배운 것의 골자는 이 문장입니다 — 우승은 한 문제의 천재가 아니라 24시간의 규율이 만든다. 천재적 순간은 통제할 수 없지만, 규율은 통제할 수 있습니다. 열거, 인수인계, 시간 상한, 스코어보드 규칙 — 이 책의 Level 3에서부터 하나씩 만든 규칙들이, 오늘 비로소 그것을 만든 이유를 드러냈습니다. 규칙은 평소의 비효율처럼 보이지만, 압박의 순간에 판단을 대신하는 유일한 장치입니다.
그리고 결과와 무관하게 기억할 것 — 승패는 데이터입니다. 이겼다면 이긴 이유가 재현 가능한지를, 졌다면 어디서 점수가 샜는지를 다음 챕터에서 냉정하게 분석합니다. 우승 도전의 마지막 절차는 시상식이 아니라 분석표이고, 그 분석표가 다음 도전의 설계도가 됩니다.
전부 체크되면 Step 336 완료입니다. 사이드바의 체크박스를 눌러 진도를 저장하세요.