대회 규칙

NYPC CODE BATTLE

수정 내역

  • 9월 24일: 파이널 라운드 규칙 추가
  • 8월 11일: 스위스 안내 추가
  • 7월 28일: 퍼포먼스 공식 추가
  • 7월 28일: 연습문제 중간 평가 추가
  • 7월 28일: 최종 제출 선택 추가
  • 7월 28일: 바이너리 파일 제출 추가
  • 7월 14일: 소스코드 용량 제한 추가
  • 7월 14일: 연습문제 논의 및 공유에 관한 내용 추가

진행 안내

NYPC <CODE BATTLE/> 은 참가자들이 제공된 게임 규칙에 따라 전략을 구현하는 프로그램(AI)를 만들어서, 다른 참가자의 AI와 경쟁하여 승패를 겨루는 대회입니다.
대회는 온라인 라운드와 파이널 라운드로 구성됩니다.

온라인 라운드

  • 참가 신청 : 7월 7일(월) – 8월 18일(월)
  • 연습문제 오픈 : 7월 14일(월) 오전 10시
  • 온라인 라운드 시작 : 8월 8일(금) 오전 10시
  • 온라인 라운드 종료 : 8월 18일(월) 오후 11시 59분

온라인 라운드 시작 전에, 7월 14일에 공개되는 연습문제를 통해 대회에서 사용하는 환경을 미리 테스트할 수 있습니다.
연습문제의 점수는 총점에 반영되지 않으며, 온라인 라운드 최종 점수에 영향을 주지 않습니다.

온라인 라운드는 10일간 자유롭게 진행됩니다. 대회 시작과 동시에 하나의 문제가 공개되며, 참가자는 정해진 마감 기한 전까지 코드를 제출할 수 있습니다.

파이널 라운드

온라인 라운드에서 우수한 성적을 거둔 상위 최소 20팀은 10월 25일(토) 판교 사옥에서 열리는 본선 대회에 참가할 수 있습니다.

  • 입장 및 등록: 9시 00분 – 9시 30분
  • 오프닝 및 대회 OT : 9시 30분 – 10시 00분
  • 본선 대회: 10시 00분 – 16시 00분 (6시간)
  • 시상식: 17시 30분 –

(모든 시각은 2025년 10월 25일 (토) KST 기준입니다.)

  • 팀원 모두가 본선 대회장에 도착해야 입장할 수 있습니다.
  • 입장 마감 시각은 정오(12시 00분)이며, 이후에는 입장할 수 없습니다.

문제 풀이

참가자는 문제 페이지에서 문제의 설명과 조건을 확인하고, 코드와 바이너리 파일 하나씩을 제출할 수 있습니다.

  • 코드는 1MiB (1048576 바이트) 이하, 바이너리 파일은 10MiB (10485760 바이트) 이하여야 합니다.
  • 제출 즉시 샘플 AI를 통한 채점이 시작되며, 채점이 완료된 후 VS: 샘플 AI 항목에서 제출 내역과 결과를 확인할 수 있습니다.
    • 채점 결과는 승/무/패 형태로 표시됩니다.
    • 항상 고정된 입력이 주어집니다.
    • 샘플 AI는같은 입력에 대해서 같은 전략을 사용합니다.
  • 답안은 여러 번 제출할 수 있지만, 최종 제출은 하나만 사용하게 됩니다.

온라인 라운드

  • 5분 이내에 2번 이상 코드를 제출했다면, 추가 제출은 두 번째(마지막) 제출이 아닌, 첫 번째(마지막 전) 제출 시점에서 5분이 경과한 이후에 가능합니다.
    • 제출 간격 및 횟수는 주최측의 사정에 따라 변경될 수 있습니다.

파이널 라운드

  • 10초에 1번 코드를 제출할 수 있습니다.

자세한 내용은 아래의 평가 규칙을 확인해 주세요.

실행 및 채점 환경

제출된 모든 코드의 실행과 채점은 다음 환경에서 이루어집니다.

  • Amazon Web Services의 c7i.4xlarge 인스턴스
  • Intel Xeon 4세대 기반 커스텀 프로세서
  • 클럭: 3.2 GHz
  • 프로세서 아키텍처: 64 bit
  • OS: Ubuntu 24.04

이 환경에서 정상적으로 동작하지 않는 코드는 채점되지 않으니 유의하시기 바랍니다.
각 언어별로 사용되는 컴파일러와 구체적인 개발 환경에 대한 정보는 [개발 도구 사용 안내] 페이지를 참고하시기 바랍니다.
시간 및 메모리 제한 초과 여부는 참가자가 제출한 소스 코드가 실행된 프로세스에서 사용하는 자원을 기준으로 판단합니다.

  • 시간 제한은 기본적으로 프로세스가 CPU를 점유한 시간(CPU time)을 측정합니다.
  • 메모리 제한은 프로세스가 사용하는 메모리 양을 측정합니다. 이때, 사용자가 선언한 변수나 배열 외에도 언어별로 사용된 라이브러리(헤더 파일, 모듈 등)와 운영체제에서 해당 프로세스에 할당한 메모리도 포함됩니다.
  • 여러 쓰레드를 활용하여 문제를 해결하는 것도 가능합니다. 단, 프로그램에는 한 개의 CPU 코어만 할당되며, 시간 및 메모리 제한을 측정할 때 모든 쓰레드의 시간 및 메모리가 합산되어 측정됩니다.

채점 결과

각 제출에 대해 아래와 같은 결과 중 하나가 표시되며, 각 결과에 대한 세부 내용은 다음과 같습니다.

  • CE (Compile Error) - 제출한 소스 코드의 컴파일에 실패한 경우입니다. '컴파일 실패' 텍스트를 클릭하시면 컴파일 실패 로그를 확인할 수 있습니다.
  • TLE (Time Limit Exceeded) - 제출한 소스 코드의 실행 시간이 문제에 명시된 시간 제한을 초과한 경우입니다.
  • WTLE (Wall Clock Time Limit Exceeded) - 제출한 소스 코드의 실제 실행 시간이 정해진 시간 제한을 초과한 경우입니다. 이는 문제에 적힌 시간제한과 관련 없이, 프로그램이 정해진 시간 제한 이후에 종료되지 않았을 때 발생합니다. 실행 중 오류가 발생하거나 출력 버퍼를 flush하지 않은 경우에 발생할 수 있습니다.
  • RE (Runtime Error) - 실행 중에 오류가 발생한 경우입니다. 메모리 제한을 초과한 경우에도 이 오류가 발생할 수 있습니다.
  • (Wrong Answer) - 프로그램이 정상적으로 종료되었으나, 출력이 올바르지 않은 경우입니다.
  • IE (Internal Error) - 알 수 없는 내부 오류가 발생한 경우입니다. 이 결과를 받았다면 주최 측에 문의해 주시기 바랍니다.
  • X승 (A/B/C) - 샘플 AI들과 대전한 결과입니다. 승리시 1점, 무승부 0.5점, 패배 0점으로 선/후공 합산하여 승패를 정합니다.

만약 같은 종류에 속하는 케이스가 서로 다른 결과를 가지는 경우, 해당 종류의 결과는 임의의 하나가 표시될 수 있습니다. 예를 들어, 같은 종류의 케이스 중 일부는 RE이고, 다른 일부는 TLE인 경우, 결과는 RE 또는 TLE 중 하나로 표시될 수 있습니다.

문제에 대한 문의

문제에 틀린 내용이 있는 경우나 알 수 없는 내부 오류 등 대회 진행에 지장이 있는 경우 문제 내의 질문하기 기능을 통해 문의할 수 있습니다.

  • 대회 중 질문 내용에 비속어, 욕설 등이 포함되어 있으면 실격 처리될 수 있으니 주의해 주시기 바랍니다.
  • NYPC는 모든 참가자에게 공평한 대회를 지향하므로, 문제 풀이에 대한 질문에는 답변을 드릴 수 없습니다.
  • 질문/답변의 의도에서 크게 벗어난 질문은 답변을 받지 못할 수 있습니다.

유효하지 않은 질문 유형

아래와 같은 질문 유형은 대표적으로 유효하지 않은 질문에 해당합니다.

"제가 작성한 프로그램이 제 컴퓨터에서는 잘 나오는데 채점하니 결과가 정상적으로 나오지 않습니다."

  • 제공된 테스트용 도구는 실제 채점 환경과는 차이가 있을 수 있습니다. 문제의 입출력 형식 등을 다시 한번 확인해주세요.

"제 컴퓨터에서는 컴파일이 잘 되는데 제출하니 컴파일 에러라고 나옵니다."

  • 참가자가 사용하는 개발 환경과 실제로 프로그램이 컴파일되고 실행되는 채점 환경은 다를 수 있습니다. [개발 도구 사용 안내] 페이지를 반드시 확인해 주세요.

답변 유형

대회 진행에 지장이 있는 사항이 아닐 때, 주최 측에서 주로 답변하는 내용은 다음과 같습니다.

  • 문제와 관련된 질문만 가능합니다. - 질문의 성격이 벗어난 경우에 해당합니다.
  • 문제 지문에 질문에 대한 답이 있습니다. - 질문한 내용이 문제에 적힌 내용으로 충분히 답이 된다고 판단된 경우입니다.
  • 답할 수 없습니다. - 영어로는 "No comment"에 해당하며, 주최 측의 답변이 어떠한 방식으로든 참가자의 문제 풀이나 대회 진행에 영향을 줄 수 있다고 판단된 경우입니다.

평가 규칙

  • VS: 샘플 AI에서 특정 점수 이상을 받은 제출 중 한 개를 최종 제출로 선택할 수 있습니다.
    • 선택한 최종 제출이 없다면, VS: 샘플 AI에서 특정 점수 이상을 받은 제출 중 가장 마지막 제출이 최종 제출로 선택됩니다.
    • 최종 제출은 대회 중에 다시 선택할 수 있습니다.
  • 최종 제출에 사용한 제출을 이용하여 중간 평가 및 최종 평가를 진행합니다.

연습 문제

중간 평가

온라인 라운드 시작 전 매일 오후 3시, 각 팀이 제출한 코드 중 최종 제출로 선택한 코드를 기준으로 평가를 진행합니다.
스위스 토너먼트 방식으로 최소 20 라운드를 진행하며, 해당 결과로 순위를 제공합니다. 해당 내용은 VS: 전국의 참가자에서 확인할 수 있습니다.

연습 문제는 최종 평가를 진행하지 않으며, 최종 성적에 반영되지 않습니다.

온라인 라운드

중간 평가

매일 오후 3시와 9시, 각 팀이 제출한 코드 중 최종 제출로 선택한 코드를 기준으로 평가를 진행합니다.
스위스 토너먼트 방식으로 최소 20 라운드를 진행하며, 해당 결과로 순위를 제공합니다. 해당 내용은 VS: 전국의 참가자에서 확인할 수 있습니다.

중간 평가는 참고용 결과이며, 최종 평가에는 영향을 미치지 않습니다.

최종 평가

스위스 토너먼트 방식으로 최소 50 라운드를 진행하여 상위 최소 100개의 팀을 선정합니다.
선정된 팀은 풀 리그 방식으로 모든 상대와 경기를 최소 5회 진행하며, 승점을 기준으로 최종 순위가 결정됩니다.

파이널 라운드

중간 평가

대회 시작 1시간 이후부터 최소 10회 이상 정해진 시점에 각 팀이 제출한 코드 중 최종 제출로 선택한 코드를 기준으로 평가를 진행합니다. 대회 당일, 대회장에서 각 중간 평가에 대한 정보를 확인할 수 있습니다.

풀 리그 방식으로 모든 상대와 경기를 진행하며, 해당 결과로 순위를 제공합니다. 해당 내용은 VS: 전국의 참가자에서 확인할 수 있습니다.

중간 평가는 참고용 결과이며, 최종 평가에는 영향을 미치지 않습니다.

최종 평가

모든 상대와 경기를 최소 5회 진행하여 각 상대와의 승수를 계산합니다. 수상자 결정 시 두 팀 승점의 차이가 근소한 경우 (승점이 우위가 있다는 귀무가설을 유의 수준 5%로 채택할 수 없는 경우) 추가 경기를 진행할 수 있습니다.

평가는 다음과 같이 진행됩니다.

  1. 본선 참가자 모두를 대상으로 한 경기를 토대로 다른 모든 상대와의 승수 합이 가장 높은 상위 10팀을 뽑습니다.
  2. 상위 10팀을 대상으로 한 경기를 토대로 다른 모든 상대와의 승수 합이 가장 높은 상위 5팀을 뽑습니다.
  3. 상위 5팀을 대상으로 한 경기를 토대로 다른 모든 상대와의 승수 합이 가장 높은 상위 2팀을 뽑습니다.
  4. 상위 2팀을 대상으로 한 경기를 토대로 상대를 더 많이 이긴 팀을 최종 우승자로 선정합니다.

토너먼트 진행

토너먼트는 스위스 토너먼트 혹은 풀 리그 방식으로 이루어집니다. 스위스 토너먼트는 정해진 라운드 수만큼 라운드를 진행하며, 풀 리그는 한 라운드 안에서 모든 상대와 정해진 대전 횟수만큼 대전을 진행합니다.

시드 결정

  • 시드는 이전 평가의 등수에 따라 부여됩니다. (등수가 작을수록 작은 시드를 받습니다.)
  • 첫 참가자의 경우, 제출 시간이 빠른 순서대로 작은 시드가 부여됩니다.

스위스 토너먼트 대전 상대 결정

1. 부전승 처리 (참가자 수가 홀수일 경우)

  • 아직 부전승을 받은 적이 없는 참가자 중에서 선정됩니다.
  • 해당 조건을 만족하는 참가자 중 점수가 가장 작은 사람이 선택됩니다.
  • 여전히 동률인 경우, 시드가 가장 작은 참가자가 선택됩니다.

2. 대전 상대 매칭

  • 점수가 큰 순서대로, 동일 점수 내에서는 시드가 큰 순서대로 매칭합니다.
  • 가능한 한 아직 대전하지 않은 상대와 매칭합니다.
  • 여러 후보가 있는 경우, 점수가 가장 큰 상대를 우선 선택합니다.
  • 여전히 동률이면, 시드가 가장 큰 상대와 매칭됩니다.

풀 리그 대전 상대 결정

  • 모든 상대와 정해진 대전 횟수만큼 대전을 진행합니다.

경기 진행 방식

  • 각 라운드에서 여러 경기가 동시에 진행됩니다.
  • 선공/후공에 따른 차이가 있는 경우, 양측이 번갈아가며 선공/후공을 수행합니다.

점수 부여

경기 결과에 따라 다음과 같이 점수가 부여됩니다:

  • 승리 - 1점
  • 무승부 - 0.5점
  • 패배 / 프로그램 오류 (런타임 에러, 잘못된 출력, 시간 초과 등) - 0점

최종 순위 결정

최종 순위는 다음 기준에 따라 결정됩니다:

  1. 총점이 큰 참가자가 더 작은 등수를 가집니다.
  2. 점수가 동일한 경우, 타이브레이커 기준을 차례대로 적용합니다.
  3. 그래도 동률이면, 시드가 작은 참가자가 더 작은 등수를 가집니다.

스위스 토너먼트 타이브레이커 기준

  1. 승점이 상대보다 더 큰 라운드 수가 많은 참가자가 더 작은 등수를 가집니다.
  2. 대전 상대들의 총 점수 합이 큰 참가자가 더 작은 등수를 가집니다.
  3. 초기 라운드 가중치 점수 합이 큰 참가자가 더 작은 등수를 가집니다. (i번째 라운드의 점수 × (총 라운드 수 - i + 1))
  4. 초기 라운드의 상대 점수에 가중치를 적용한 합이 큰 참가자가 더 작은 등수를 가집니다. (i번째 라운드의 상대 점수 × (총 라운드 수 - i + 1))

풀 리그 타이브레이커 기준

  1. Sonneborn-Berger 점수가 큰 참가자가 더 작은 등수를 가집니다. (모든 경기에 대해 해당 경기의 내 승점 × 상대 총점의 합)

퍼포먼스

제출한 코드의 실력을 가늠하기 위한 퍼포먼스를 제공합니다. 퍼포먼스는 참고용 자료이며, 평가에 반영되지 않습니다.

  • VS: 샘플 AI에서 샘플 AI와의 대전을 통해 얻은 승수를 기반으로 "예상 퍼포먼스"를 제공합니다.
  • VS: 전국의 참가자에서 전국의 참가자와의 대전 결과를 통해 퍼포먼스가 계산됩니다.

퍼포먼스 계산 공식에 대해서는 퍼포먼스 계산 공식 pdf를 참고해 주세요.

부정행위

다음과 같은 행위는 부정행위로 간주되며, 부정행위 적발 시 불이익을 받을 수 있습니다.

  • 연습문제가 아닌 문제에 대해, 문제 및 문제와 관련된 알고리즘, 솔루션, 소스코드를 불특정 다수에게 공개하거나 유출하는 행위
  • 연습문제가 아닌 문제 관련 자료에 대해 팀원 외 제3자와 토론하는 행위
  • 사용 권한이 없는 코드를 제출하는 행위
    • 예시 1: 해킹 등의 방법으로 얻은 코드
    • 예시 2: 상용 프로그램의 리버싱(역분석) 등의 방법을 사용해 얻은 코드
    • 예시 3: 기타 불법적인 방법으로 얻은 코드
    • 인터넷 등에 불특정 다수에게 공개되어 있는 코드이더라도 출처를 주석 등으로 표시하지 않았다면 사용 권한이 없는 것으로 간주합니다.
  • 팀원 이외의 사람이 대회 시작 시점 이후에 작성한 코드를 제출하는 행위
  • 대리 응시 혹은 팀원 이외의 사람에게 도움을 받아 문제를 해결한 경우
  • 개인 아이디 및 패스워드를 타인에게 공유하거나 공개한 경우
  • 동일인이 여러 아이디로 중복 참가한 경우
  • 타인의 대회 참여를 방해하거나 시스템을 공격하는 행위
  • 기타 통상적으로 부정행위라고 볼 수 있는 행위

위의 항목은 예시이며, 이외에도 주최 측 판단에 따라 부정행위로 간주될 수 있습니다.
부정행위가 발생되거나 의심되는 경우, 대회 기간 중 언제든지 참가 및 수상 자격이 박탈될 수 있습니다.
대회 운영에 지장을 초래한 경우, 주최 측은 법적 조치 및 손해배상을 청구할 수 있습니다.

아래의 행위는 부정행위가 아닙니다.

  • 연습문제에 대해 문제, 문제 내용, 풀이 방법, 소스코드 등을 논의하거나 공유하는 행위
  • 팀원 간 문제 내용, 풀이 방법, 소스코드 등을 논의하거나 공유하는 행위
    • 특히, 외부인이 볼 수 없는 비공개 대화방 또는 코드 저장소를 사용하는 것은 부정행위가 아닙니다.
    • 단, 대화방 혹은 코드 저장소를 사용할 경우 공개 범위 설정에 각별히 유의해주시기 바랍니다.
  • LLM(ChatGPT, Copilot 등) 및 기타 코딩 보조 도구를 사용하여 코드를 생성하거나 수정하는 행위

어떤 행위가 부정행위인지 궁금하다면 자의적으로 판단하지 말고, 반드시 주최 측에게 문의하시기 바랍니다.