Step 328. 국제 대회 출전 — 글로벌 대회 경험: 세계의 천장을 보고 온다

Step 328. 국제 대회 출전 — 글로벌 대회 경험: 세계의 천장을 보고 온다

Level 4 — 전문가 | 난이도 ★★★★★ | 예상 소요 시간 2일 이상 (시차 전략 수립 + 48시간 대회 완주 + 결과 기록)

전제: Step 324~326의 국내 대회 출전 사이클, Step 327의 격차 분석 프레임. 팀 채널 운영과 교대 규칙이 몸에 배어 있어야 합니다.

  • 준비물: CTFtime에서 고른 메이저 국제 대회 1개(Google CTF, DEF CON Qualifiers, Plaid CTF 등), 팀 채널, 교대표, Step 327의 격차 분석 양식. 시차 계산 스크립트는 여러분의 대회 일정으로 돌리는 실측 도구이고, 대회 장면과 순위는 전부 화면 예시입니다.
  • 주의: 이 대회의 목표는 우승이 아닙니다 — 완주, 그리고 "세계 최고가 무엇을 내는가"의 체감입니다. 목표를 낮추는 것이 아니라 정확하게 설정하는 것입니다.
  • ⚠️ 이 챕터의 실습은 내 랩·합법 플랫폼 전용입니다. 허가 없는 시스템에 적용하면 범죄입니다. 대회 규정(팀 인원, 외부 협업 금지)을 시작 전에 읽고 지킵니다.

국내 본선까지 경험한 여러분의 다음 무대는 세계입니다. Google CTF, DEF CON Qualifiers, Plaid CTF — 이 대회들은 난이도의 차원이 다릅니다. 문제 하나가 연구 수준이고, 세계 랭킹 팀들이 48시간을 풀가동합니다. 국내 대회에서 상위권이던 팀도 여기서는 0솔브 구간을 지나는 것이 정상입니다.

그런데 그것이 이 대회의 가치입니다. 소재 원문의 문장 그대로, "세계 최고가 무엇을 내는가"를 체감하는 것이 진짜 수확입니다. 오늘은 그 수확을 극대화하는 운영법을 배웁니다 — 시차와의 싸움, 영어 커뮤니케이션, 0솔브 구간을 버티는 정신 운영, 그리고 대회가 남기는 재료의 확보까지.


1. 학습 목표

이 챕터를 끝내면 다음을 할 수 있습니다:

  • 국제 대회와 국내 대회의 차이(규모·난이도·시간대·언어)를 설명하고 각각의 대응을 세운다
  • CTFtime에서 대회를 선정하고 시차를 계산해 수면·교대 계획을 세운다
  • 48시간 대회의 교대표를 작성해 "항상 누군가 진행 중"인 상태를 유지한다
  • warmup 문제 선별의 안목으로 첫 점수를 확보하고 0솔브 구간을 관리한다
  • 종료 후 순위·풀이·미해결 문제를 기록해 다음 Step의 재료로 확보한다

2. 배경 지식 — 오늘의 도구와 개념

오늘의 도구 한눈에 보기

구분 내용
언어·환경 파이썬 3(시차 계산·교대표), CTFtime, 대회 플랫폼, 팀 채널, 영어 Write-up
오늘의 명령 python step328_timezone.py — UTC 일정의 한국 시간 변환과 교대표 생성
필요한 개념 시차 전략, 교대 근무, warmup 선별, 0솔브 구간 관리, 영어 커뮤니케이션
오늘의 산출물 시차·교대 계획표 + 대회 로그 + 순위 기록 + 미해결 문제 저장 목록

2-1. 국제 대회는 무엇이 다른가 — 네 가지 차이

국내 메이저 대회와 국제 메이저 대회의 차이를 네 축으로 정리합니다.

국내 메이저 (코드게이트·CCE) 국제 메이저 (Google CTF·DEF CON Quals)
규모 수십~수백 팀 수백~수천 팀, 세계 랭킹 팀 전원 참가
난이도 본선 진출 커트라인 구조 문제 하나가 연구 수준 — 0솔브 팀이 다수
시간대 한국 낮 시간대 미국·유럽 기준 — 한국 새벽 시작이 흔함
언어 한국어 공지·문제 전 과정 영어 — 문제·공지·채널

네 차이 중 실력으로 못 넘는 것은 난이도뿐입니다. 규모는 무시하면 되고, 시간대와 언어는 준비로 상쇄됩니다. 그래서 오늘의 운영은 시차와 언어에 집중됩니다 — 실력 싸움은 실력이 자라면 하면 되고, 오늘은 "그 실력이 최대한 발휘되는 조건"을 만드는 게 일입니다.

2-2. 시차 전략 — 대회는 현지 시간이 아니라 생체 시간으로 치른다

48시간 대회가 한국 새벽 3시에 시작한다고 가정해 봅시다. 선택지는 세 가지입니다 — ① 새벽 3시에 맞춰 밤을 새우고 시작, ② 자고 일어나 합류, ③ 시작 전에 미리 자 두고 새벽에 일어나 참전. 정답은 ③입니다 — "시작 6시간 전 취침 후 새벽 참전"(소재 원문)이 그것입니다.

이유는 간단합니다. 대회의 첫 6시간은 전 문제 열거와 warmup 회수라는 가장 가치 있는 구간이고, 이 구간을 "24시간 깨어 있던 뇌"로 보낼 것인지 "방금 잠에서 깬 뇌"로 보낼 것인지의 차이입니다. ①을 택하면 대회 중반이 생체 시간의 최저점과 겹칩니다. ③은 그 최저점을 대회 시작 전으로 당깁니다.

그리고 48시간은 한 사람의 시간이 아닙니다. 교대표를 짜서 누군가는 항상 진행 중이게 합니다 — 3-3의 도구가 이 교대표를 만들어 줍니다. 밤샘 구간(한국 시간 00~06시)을 한 사람에게 몰아주지 않는 것이 교대표의 공정성 규칙입니다.

2-3. 영어 커뮤니케이션 — 유창함이 아니라 정확함

국제 대회의 문제 설명, 공지, 그리고 종료 후의 Write-up은 전부 영어입니다. 필요한 것은 유창한 영어가 아니라 정확한 기술 영어입니다.

실전에서 부딪히는 세 장면의 대응입니다. ① 문제 설명 읽기 — 모르는 단어를 넘기지 말고 기술 용어인지 확인합니다. 대회 영어의 어휘는 한정되어 있고, 이 책의 용어들이 그대로 등장합니다. ② 운영진에게 질문 — 대회 채널에서의 질문은 템플릿이 있습니다: "문제 상황 / 기대 동작 / 실제 동작 / 시도한 것"의 네 문장. ③ Write-up 읽기 — Step 327의 격차 분석이 그대로 영어로 확장됩니다. 세계 랭킹 팀의 Write-up은 국내 대회 Write-up보다 생략이 많지만, 구조는 같습니다.

운영진 문의 템플릿 (화면 예시):
> Challenge: [문제명]
> Expected: [문제 설명상 기대한 동작]
> Actual: [실제로 관찰된 동작 — 에러 메시지 원문]
> Tried: [이미 시도한 것들]
> Is the challenge environment working as intended?

마지막 문장이 핵심입니다 — "풀이를 알려달라"가 아니라 "환경이 의도대로 동작하는가"를 묻는 것이 대회 문화의 규칙입니다. 힌트 요구는 무시되지만, 환경 이상 제보는 답변을 받습니다.

2-4. 0솔브 구간 — 국제 대회의 통과 의례

국제 메이저 대회의 첫 경험에서 대부분의 팀이 지나는 구간이 있습니다 — 몇 시간 동안 아무것도 풀지 못하는 시간. 소재 원문의 표현 그대로, 48시간 내내 0솔브 구간의 자괴감이 올 수 있고, 그 구간을 버티는 것 자체가 이 Step의 훈련입니다.

버티는 방법은 재정의입니다. 이 대회의 목표를 순위가 아니라 세 가지로 다시 씁니다. ① warmup 문제라도 1문제 — 국제 대회에도 초반 warmup은 있습니다. 전 문제를 훑고 "우리가 갈 수 있는 문제"를 빠르게 선별하는 안목이 여기서 쓰입니다. ② 세계 최고의 문제를 직접 만져 보는 경험 — 풀지 못해도 문제의 구조를 보고, 시도하고, 막힌 지점을 기록하는 것 자체가 훈련입니다. ③ 재현할 재료의 확보 — 대회가 끝나면 상위 팀의 Write-up이 공개됩니다. 오늘 못 푼 문제는 다음 Step의 신기법 교과서가 됩니다.

자괴감의 순간에 이 세 가지가 손에 남아 있다면, 그 시간은 낭비가 아니라 채굴입니다.


3. 따라 하기

3-1. 대회 선정 — CTFtime에서 고르는 법

CTFtime에서 다가오는 메이저 대회를 확인하고 팀 일정을 맞춥니다. 선정의 기준은 네 가지입니다.

국제 대회 선정 체크리스트 (화면 예시):
[ ] 가중치(weight) — CTFtime 가중치가 높을수록 상위 팀이 몰리고 문제 품질이 검증됨
[ ] 형식 — 제퍼디인가, 시간은 24/36/48시간 중 무엇인가
[ ] 시간대 — 시작 시각(UTC)이 한국 시간으로 언제인가 (3-3에서 계산)
[ ] 팀 일정 — 48시간 중 팀원 전원이 어느 구간을 커버할 수 있는가

처음 한두 번은 가중치 최상위 대회보다 한 단계 아래의 대회가 좋은 입문입니다. 메이저 대회의 분위기를 익히되, warmup 문제의 솔브 가능성이 조금 더 높은 무대에서 첫 완주의 경험을 쌓는 것입니다.

3-2. 시간대 전략 — 수면 계획을 먼저 정한다

대회가 확정되면 문제가 아니라 수면부터 계획합니다. 2-2의 원칙을 우리 대회에 적용합니다.

시간대 전략 수립 예시 (화면 예시):
- 대회 시작: 토요일 새벽 3:00 (한국 시간), 48시간
- 전략: 금요일 21:00 취침 → 토요일 02:30 기상 → 03:00 시작부터 참전
- 교대: 3인 8시간 교대, 밤샘 구간(00~06 시작 교대)은 1인 1회
- 회의: 매 교대 시작 시 15분 인수인계, 12시간마다 30분 전체 회의

수면 계획이 먼저인 이유 — 수면이 정해져야 교대표가 서고, 교대표가 서야 "누가 언제 어떤 문제를 보는가"의 배정이 가능하기 때문입니다. 국제 대회에서 수면은 휴식이 아니라 작전의 그리드입니다.

3-3. 시차 계산과 교대표 생성 — 도구로 정확하게

감으로 시차를 계산하면 하루를 틀립니다(날짜 변경선 문제). step328_timezone.py로 저장하세요 — 표준 라이브러리 zoneinfo만 사용합니다.

# step328_timezone.py — 국제 대회 시차 계산 + 교대 근무표 생성기
from datetime import datetime, timedelta
from zoneinfo import ZoneInfo

UTC = ZoneInfo("UTC")
KST = ZoneInfo("Asia/Seoul")

# 대회 정보 (교체해 사용)
EVENTS = [
    ("Google CTF (예시)",        datetime(2026, 6, 20, 18, 0, tzinfo=UTC), 48),
    ("DEF CON Qualifiers (예시)", datetime(2026, 5, 16, 0, 0, tzinfo=UTC),  48),
    ("Plaid CTF (예시)",          datetime(2026, 4, 11, 1, 0, tzinfo=UTC),  36),
]

print("=== 국제 대회 시차 계산 (UTC -> 한국 시간) ===\n")
for name, start_utc, hours in EVENTS:
    s = start_utc.astimezone(KST)
    e = (start_utc + timedelta(hours=hours)).astimezone(KST)
    wd = "월화수목금토일"[s.weekday()]
    print(f"{name}")
    print(f"   시작: {s:%Y-%m-%d %H:%M} ({wd}) KST  /  종료: {e:%m-%d %H:%M} KST  ({hours}시간)")
    # 한국 기준 밤샘 구간 계산 (00:00~06:00과 겹치는 시간)
    cur, night = s, timedelta(0)
    while cur < e:
        nxt = min(cur + timedelta(minutes=30), e)
        if cur.hour < 6:
            night += nxt - cur
        cur = nxt
    print(f"   한국 시간 00~06시 구간과 겹치는 시간: {night.seconds//3600}시간 {night.seconds%3600//60}분\n")

# 48시간 대회 3인 교대표 예시
print("=== 48시간 대회 3인 교대표 예시 (한국 시간) ===")
start = datetime(2026, 6, 21, 3, 0, tzinfo=KST)   # 토요 새벽 3시 시작 가정
members = ["A", "B", "C"]
shift = timedelta(hours=8)
cur = start
for i in range(6):
    who = members[i % 3]
    print(f"   {cur:%m-%d %H:%M} ~ {(cur+shift):%m-%d %H:%M}  근무: {who}"
          + ("   <- 밤샘 구간" if 0 <= cur.hour < 6 else ""))
    cur += shift
print("\n규칙: 밤샘 구간(00~06시 시작 교대)은 3인이 공평하게 한 번씩만 맞는다.")

실행한 실측 출력입니다:

=== 국제 대회 시차 계산 (UTC -> 한국 시간) ===

Google CTF (예시)
   시작: 2026-06-21 03:00 (일) KST  /  종료: 06-23 03:00 KST  (48시간)
   한국 시간 00~06시 구간과 겹치는 시간: 12시간 0분

DEF CON Qualifiers (예시)
   시작: 2026-05-16 09:00 (토) KST  /  종료: 05-18 09:00 KST  (48시간)
   한국 시간 00~06시 구간과 겹치는 시간: 12시간 0분

Plaid CTF (예시)
   시작: 2026-04-11 10:00 (토) KST  /  종료: 04-12 22:00 KST  (36시간)
   한국 시간 00~06시 구간과 겹치는 시간: 6시간 0분

=== 48시간 대회 3인 교대표 예시 (한국 시간) ===
   06-21 03:00 ~ 06-21 11:00  근무: A   <- 밤샘 구간
   06-21 11:00 ~ 06-21 19:00  근무: B
   06-21 19:00 ~ 06-22 03:00  근무: C
   06-22 03:00 ~ 06-22 11:00  근무: A   <- 밤샘 구간
   06-22 11:00 ~ 06-22 19:00  근무: B
   06-22 19:00 ~ 06-23 03:00  근무: C

규칙: 밤샘 구간(00~06시 시작 교대)은 3인이 공평하게 한 번씩만 맞는다.

읽는 법: 세 가지를 봅니다. ① 같은 48시간 대회도 시작 시각에 따라 한국 시간 체감이 완전히 다릅니다 — Google CTF(예시)는 일요일 새벽 3시 시작이라 시작 직후가 생체 최저점이고, DEF CON Quals(예시)는 토요일 아침 9시 시작이라 첫날이 온전한 주간입니다. 시작 시각이 전략의 첫 입력값인 이유입니다. ② "밤샘 구간 겹침" 숫자 — 48시간 대회는 어느 시간에 시작해도 12시간의 심야가 포함됩니다. 피할 수 없으면 분배하는 것이 답입니다. ③ 교대표의 구조 — 8시간 교대 3인 로테이션에서 밤샘 구간(03시 시작 교대)을 A가 두 번 연속 맞는 것이 보입니다. 4인 팀이라면 분산되지만, 3인 팀에서는 불가피합니다 — 이럴 때 규칙은 "밤샘 다음 근무는 반드시 수면 블록"으로 보완합니다. 여러분의 대회 일정과 팀원 수로 바꿔 실행해 보세요.

3-4. 출전 — warmup 선별과 0솔브 구간의 통과

대회가 시작되면 운영은 국내 대회와 같은 골격입니다 — 초기 전 문제 열거, 점수 효율 순 착수, 교대 규칙. 다른 점은 선별의 기준입니다. 국제 대회에서는 "우리가 갈 수 있는 문제"를 찾는 안목이 첫 번째 전투입니다.

국제 대회 진행 기록 (화면 예시):
[03:00] 시작. 전 문제 열거 — 22문제. 규모의 압박이 먼저 온다
[03:50] 열거 완료. warmup 표시 문제 2개 + 솔브 수 증가 중인 문제 1개 후보
[05:20] warmup misc 해결 (+50). 0솔브 탈출 — 스코어보드에 우리 팀 이름
[09:00] 2차 후보 문제들 전원 착수 — 전부 상위권 팀만 푸는 문제로 확인
[14:00] web 문제에서 진전 — 인증 우회까지. 그러나 그 다음 체인에서 정체
[19:00] 교대 회의 — 1솔브 유지. 목표 재확인: "추가 1솔브 or 재료 확보"
[27:00] web 문제 포기 판단 — 시도 내역 전량 저장, rev 문제로 전환
[40:00] rev 문제 일부 단계 해결 — 플래그에는 미치지 못함, 진전 기록
[48:00] 종료. 최종 1솔브, 상위 30%권 기록

읽는 법: 이 기록의 27시간 차, "포기 판단"이 국제 대회의 핵심 기술입니다. 국내 대회의 교대 규칙이 "2시간"이었다면, 국제 대회의 포기 규칙은 더 엄격해야 합니다 — 문제의 바닥이 보이지 않기 때문입니다. 단, 포기는 삭제가 아닙니다. 시도 내역을 전량 저장하는 포기는 재료의 확보이고, 이것이 2-4의 재정의("채굴")가 행동으로 구현된 모습입니다.

3-5. 종료 후 — 재료 확보와 기록

종료 후의 절차는 국내 대회와 같되, 한 가지가 더 중요해집니다 — 미해결 문제의 저장입니다.

종료 후 기록 양식 (화면 예시):
- 최종 순위 / 솔브 수 / 획득 점수:
- 푼 문제: 네 줄 기록 (문제명·기법·단서·소요)
- 시도한 문제: 문제명, 진전 지점, 막힌 지점, 다음 가설 — 파일·스크린샷 포함
- 못 열어 본 문제: 목록만이라도 (Write-up 수집 시 대조용)
- 시간대 평가: 교대표는 지켜졌는가, 밤샘 구간의 생산성은 어땠는가
- 영어 커뮤니케이션: 막힌 표현, 운영진과의 문의 기록

이 기록은 다음 챕터(Step 329, 신기법 분석)의 원료입니다. 상위 팀의 Write-up이 공개되면, "시도한 문제" 목록과 대조하며 읽는 것이 국제 대회 Write-up의 올바른 독법입니다 — 만져 본 문제의 풀이는 읽히는 속도가 다릅니다.


4. 미션과 연습문제

미션 — 국제 대회 완주와 재료 확보

  1. CTFtime에서 선정 체크리스트(3-1)로 대회를 고르고 팀 일정을 확정합니다.
  2. step328_timezone.py에 대회의 실제 시작 시각(UTC)과 길이를 넣어 한국 시간 일정과 밤샘 겹침을 계산하고, 팀원 수에 맞는 교대표를 만듭니다.
  3. 시간대 전략(3-2)을 확정합니다 — 시작 전 취침 계획 포함.
  4. 48시간을 교대표대로 완주합니다 — warmup 선별, 0솔브 구간의 재정의, 포기 시 시도 내역 전량 저장.
  5. 종료 후 기록 양식(3-5)을 완성하고, 미해결 문제의 파일과 시도 내역을 저장해 다음 Step의 재료로 확보합니다.

연습문제

문제 1. 국제 대회의 네 가지 차이(규모·난이도·시간대·언어) 중 "준비로 상쇄되는 것"과 "실력으로 넘어야 하는 것"을 구분하고, 그 구분이 준비 전략에 주는 함의를 설명해 보세요.

문제 2. 새벽 3시 시작 대회에서 "시작 6시간 전 취침 후 새벽 참전"이 "밤을 새우고 시작"보다 유리한 이유를, 대회의 가치 있는 구간과 생체 리듬의 관계로 설명해 보세요.

문제 3. 운영진 문의 템플릿(2-3)의 마지막 문장이 "힌트를 달라"가 아니라 "환경이 의도대로 동작하는가"인 이유를, 대회 문화의 규칙으로 설명해 보세요.

문제 4. 3-4 화면 예시의 27시간 차 "포기 판단"이 왜 패배가 아니라 합리적 운영인지, 포기 시 "시도 내역 전량 저장"이 그 판단의 가치를 바꾸는 원리와 함께 설명해 보세요.


5. 모범 답안과 완료 기준

미션 모범 답안

검증 기준으로 확인하세요.

  1. 선정의 근거: 가중치·형식·시간대·팀 일정의 네 기준이 기록됐는가 — "유명해서"는 근거가 아닙니다.
  2. 시차의 정확성: 스크립트 출력의 한국 시간 변환과 밤샘 겹침 시간이 교대표에 반영됐는가 — 감으로 계산한 흔적(날짜 변경선 오류 등)이 없는가.
  3. 수면의 선행성: 취침·기상 계획이 교대표보다 먼저 문서에 있는가.
  4. 완주의 증거: 대회 로그에 교대 인수인계가 시간대별로 남아 있는가.
  5. 재료의 완결성: 시도한 문제마다 "진전 지점·막힌 지점·다음 가설"이 저장됐고, 못 열어 본 문제의 목록도 있는가.

연습문제 해답

문제 1 해답. 준비로 상쇄되는 것은 시간대와 언어이고, 실력으로 넘어야 하는 것은 난이도입니다(규모는 무시 대상). 시차는 수면 계획과 교대표로, 언어는 기술 영어 독해와 문의 템플릿으로 대비할 수 있습니다 — 둘 다 대회 전에 완성 가능한 항목입니다. 반면 난이도는 대회 당일에 바꿀 수 없고, 오직 평소 훈련의 축적으로만 넘습니다. 함의는 준비 시간의 배분입니다 — 대회 전날까지 기술 훈련을 하는 것이 아니라, 시차·언어·운영의 상쇄 가능한 변수들을 제거하는 데 준비를 쓰고, 난이도에 대해서는 "오늘의 실력 그대로 측정"하는 자세로 임합니다. 상쇄 가능한 변수에서 점수를 새는 것이 가장 아까운 패배입니다.

문제 2 해답. 대회의 첫 6시간은 전 문제 열거와 warmup 회수라는 기대 가치가 가장 높은 구간입니다 — 문제 목록이 확정되고, 쉬운 문제의 솔브 경쟁이 벌어지는 골든타임입니다. 밤을 새우고 시작하면 이 구간을 "이미 20시간 이상 깨어 있던 뇌"로 보내고, 대회 중반(24~30시간 차)에 생체 시간의 최저점이 겹칩니다. 반면 시작 6시간 전 취침은 그 최저점을 대회 시작 전으로 이동시켜, 골든타임을 방금 잠에서 깬 뇌로 보내게 합니다. 같은 48시간이라도 "어느 구간을 맑은 뇌에 배정하는가"가 성과를 바꾸므로, 수면은 휴식이 아니라 구간 배정의 전략입니다.

문제 3 해답. CTF의 규칙에서 힌트는 모든 참가자에게 공평해야 하므로, 개별 팀의 힌트 요구는 무시되거나 거절됩니다 — 그것은 무례가 아니라 공정의 유지입니다. 반면 "환경이 의도대로 동작하는가"는 게임의 전제에 관한 질문입니다. 서버가 내려갔거나 문제 파일이 손상됐다면 그것은 한 팀의 핸디캡이 아니라 대회의 사고이고, 운영진은 이 질문에 답할 의무가 있습니다. 템플릿의 네 문장(상황·기대·실제·시도)은 질문이 "귀찮은 힌트 요구"가 아니라 "검증 가능한 환경 리포트"임을 보여 주는 형식입니다. 문화를 이해하는 것도 실력입니다 — 답을 얻는 질문과 무시되는 질문의 차이는 영어 실력이 아니라 이 규칙의 이해에서 갈립니다.

문제 4 해답. 국제 대회의 문제는 바닥이 보이지 않는 난이도를 가지므로, 한 문제에 대한 무제한 투입은 다른 모든 문제의 기회를 태웁니다 — 27시간 차에 "아직 안 풀린" 문제가 48시간 차에 풀릴 확률은 경험적으로 낮고, 그 사이 다른 문제에서의 진전 가능성을 포기하는 셈입니다. 포기 규칙은 이 기회비용을 관리하는 장치입니다. 그리고 "시도 내역 전량 저장"이 이 포기를 패배에서 투자로 바꿉니다 — 저장된 시도 내역은 대회 후 상위 팀 Write-up을 읽을 때의 대조 자료가 되고(Step 327의 프레임), Step 329의 신기법 분석에서는 "어느 단계까지 갔는가"가 그 기법의 이해 깊이를 결정합니다. 기록 없는 포기는 손실이지만, 기록 있는 포기는 다음 대회의 실력으로 전환되는 재료입니다.

완료 기준 체크리스트

  • [ ] CTFtime에서 대회를 네 기준(가중치·형식·시간대·일정)으로 선정했다
  • [ ] 시차 계산 스크립트로 한국 시간 일정과 밤샘 겹침을 확인했다
  • [ ] 수면 계획을 먼저 정하고 교대표를 그 위에 작성했다
  • [ ] 밤샘 구간의 공정 분배(또는 3인 팀의 보완 규칙)를 적용했다
  • [ ] warmup 선별로 첫 솔브에 도전하고 0솔브 구간을 재정의로 관리했다
  • [ ] 48시간을 교대표대로 완주하고 순위를 기록했다
  • [ ] 시도한 문제의 진전·막힌 지점·다음 가설을 전량 저장했다
  • [ ] 종료 후 기록을 완성해 다음 Step(신기법 분석)의 재료로 확보했다

6. 흔한 실수와 해결

벽 1. 시차 계산을 잘못해서 하루를 통째로 날렸어요

증상: "토요일 밤 9시 시작"으로 알고 있다가 금요일 밤 9시였던 것을 대회 시작 후에 깨닫습니다.

원인: UTC→KST 변환에서 날짜 변경을 손으로 하다 틀리는 전형적 사고입니다 — UTC 금요일 12:00은 한국 금요일 21:00이지만, UTC 금요일 18:00은 한국 토요일 03:00입니다.

해결: 시차는 손으로 계산하지 마세요 — 3-3의 스크립트처럼 zoneinfo로 기계 변환합니다. 그리고 세 장치를 겹칩니다. ① 캘린더에 대회 플랫폼이 주는 "로컬 시간" 표기를 그대로 등록(플랫폼은 보통 브라우저 시간대로 표시합니다). ② 변환 결과를 팀 채널에 붙여 넣어 팀원 전원이 교차 확인. ③ 시작 24시간 전과 1시간 전에 알람. 시차 사고는 실력 문제가 아니라 이중 확인의 부재 문제입니다.

벽 2. zoneinfo에서 시간대를 못 찾아요

증상: 윈도우에서 실행했더니 이런 에러가 뜹니다.

zoneinfo._common.ZoneInfoNotFoundError: 'No time zone found with key Asia/Seoul'

원인: 윈도우에는 IANA 시간대 데이터가 없어서, 파이썬이 시스템에서 시간대 정보를 못 찾을 때 발생합니다 (실측 — tzdata 패키지가 없는 윈도우 환경).

해결: pip install tzdata로 시간대 데이터 패키지를 설치하세요. 파이썬 공식 문서도 윈도우에서는 이 패키지를 권합니다. 오프라인 환경이라면 수동 계산으로 대체합니다 — KST는 UTC+9 고정이므로 timedelta(hours=9)를 더하는 방식으로 스크립트를 바꾸면 됩니다.

벽 3. 문제 설명의 영어가 벽이에요 — 번역기를 돌려도 이상해요

증상: 기계 번역이 기술 용어를 엉뚱하게 바꿉니다(예: "padding oracle"을 "여백 신탁"으로).

원인: 기술 영어는 고유명사의 집합이라 일반 번역 모델이 훼손합니다.

해결: 번역 순서를 바꾸세요 — 기술 용어는 원문 그대로 두고 문장의 구조만 번역합니다. 용어집을 팀 채널에 고정해 두세요 — 이 책에서 배운 용어들(oracle, primitive, gadget, sandbox escape 등)이 그대로 등장합니다. 그리고 이 챕터의 숨은 수확이 여기 있습니다 — 국제 대회 몇 번이면 기술 영어 독해는 저절로 자랍니다. 첫 대회에서 독해에 쓴 시간을 기록해 두면, 다음 대회에서 그 시간이 줄어든 것으로 성장을 측정할 수 있습니다.

벽 4. 48시간 중반에 팀 전원이 동시에 무너져요

증상: 둘째 날 오후, 교대표가 무너지고 아무도 문제를 보지 않는 공백이 생깁니다.

원인: 교대표는 있었지만 "지키는 장치"가 없었던 것입니다 — 피로 누적으로 인수인계가 생략되고, 생략이 공백을 만듭니다.

해결: 교대의 집행 장치 세 가지. ① 인수인계 없는 퇴근 금지 — 다음 근무자가 "인수인계 문서 확인"을 완료해야 이전 근무자가 쉽니다. ② 공백 감시 — 팀 채널에 마지막 활동이 30분 없으면 누구든 근무자를 호출하는 규칙. ③ 사전 동기 부여 — 2-4의 재정의를 대회 전에 소리 내어 합의해 둡니다: "우리의 목표는 완주와 재료 확보다. 1솔브여도 성공이다." 중반의 붕괴는 대부분 체력보다 의미의 붕괴에서 시작됩니다 — 의미를 사전에 합의해 두는 것이 가장 강한 장치입니다.

벽 5. 국제 대회에서 1솔브도 못 했어요 — 출전이 의미 있었나요?

증상: 48시간 완주, 0솔브. 팀의 자괴감이 큽니다.

원인: 국제 메이저 대회에서 0솔브 팀은 전체의 상당수입니다 — 이것은 실패가 아니라 이 대회의 난이도 분포입니다.

해결: 2-4의 재정의를 다시 읽고, 완료 기준의 마지막 두 항목을 확인하세요 — "시도한 문제의 기록 전량 저장"과 "다음 Step의 재료 확보"가 완료됐다면 이 대회의 목표는 달성된 것입니다. 그리고 사실 하나를 확인하세요 — 0솔브라도 문제를 만져 본 것과 보지도 않은 것은 다릅니다. 여러분이 시도한 문제의 상위 팀 Write-up이 공개될 때, 그 풀이가 "읽히는 속도"가 다른 독자와 다를 것입니다. 그 차이가 이번 대회가 남긴 실력입니다. 순위는 CTFtime에 남고, 재료는 팀에 남습니다.


7. 정리

오늘의 개념

개념 한 줄 설명
국제 대회의 4차이 규모·난이도·시간대·언어 — 상쇄 가능한 것과 실력의 것을 구분
시차 전략 수면이 먼저, 교대표는 그 위에 — 생체 최저점을 대회 밖으로
8시간 교대 근무 누군가는 항상 진행 중 — 밤샘 구간의 공정 분배가 규칙
warmup 선별 "우리가 갈 수 있는 문제"를 찾는 안목 — 첫 전투
0솔브 구간 관리 재정의(완주·경험·재료)로 버티는 정신 운영
기술 영어 유창함이 아니라 정확함 — 용어 원문 유지 + 문의 템플릿

오늘의 도구·명령어

도구·명령 하는 일
python step328_timezone.py UTC→한국 시간 변환·밤샘 겹침 계산·교대표 생성
선정 체크리스트 가중치·형식·시간대·팀 일정의 네 기준
운영진 문의 템플릿 상황·기대·실제·시도 + 환경 확인 질문
종료 후 기록 양식 순위·풀이·시도 내역·시간대 평가·영어 기록
인수인계 집행 장치 문서 확인 후 퇴근 · 공백 감시 · 사전 의미 합의

명령어보다 중요한 감각

국제 대회의 첫 수확은 점수가 아니라 기준의 갱신입니다. 세계 최고가 48시간에 무엇을 하는가를 본 뒤에는, 우리의 "잘한다"의 정의가 바뀝니다. 그 갱신이 아프지만 필요한 과정입니다 — 국내의 천장이 세계의 바닥인 것을 아는 팀만이 다음 계단을 설계할 수 있으니까요.

그리고 오늘 저장한 재료들을 기억하세요 — 시도 내역, 막힌 지점, 그리고 곧 공개될 세계 랭킹 팀들의 Write-up. 이 재료들이 Step 329의 신기법 분석에서 "그해의 최신 공격 기법 교과서"로 변합니다. 국제 대회는 48시간이지만, 그것이 가져오는 학습은 몇 주간 이어집니다.


전부 체크되면 Step 328 완료입니다. 사이드바의 체크박스를 눌러 진도를 저장하세요.