채점 환경

  • AWS EC2를 사용합니다.
    • 인스턴스 타입: c4.large
    • 프로세서: Intel Xeon E5-2666v3
    • 클럭: 2.9 GHz
    • 메모리: 3.75 GiB
    • 프로세서 아키텍쳐: 64-bit
  • OS: Ubuntu 16.04.4 LTS

컴파일 또는 실행 옵션, 컴파일러 버전

채점 방식

입력은 Standard Input(stdin)에서 받아야 하고, 출력은 Standard Output(stdout)에 해야 합니다.

문제 별로 준비되어 있는 데이터 파일을 하나씩 넣어서 실행해보고 그 출력 파일과 미리 구해 놓은 정답 파일과 비교합니다.

문제의 출력 형식을 지키지 않으면, 틀리게 됩니다. 예를 들어, N과 M을 입력하세요.와 같은 메시지를 화면에 출력하는 것 입니다.

Standard Error(stderr)에 출력을 하면 를 받게 됩니다.

문제의 정답이 여러가지인 경우에는 스페셜 저지로 채점을 하게 됩니다. 스페셜 저지는 유저가 출력한 답을 검증하는 코드를 통해서 정답 유무를 결정하는 방식입니다.

채점 순서

채점 순서는 다음과 같은 우선 순위를 갖습니다.

  1. 일반 제출
  2. 채점 우선 순위가 낮은 문제의 제출, 관리자 제출, 기록을 남기지 않는 재채점
  3. 기록을 남기는 재채점
  4. 기타 제출

일반 제출은 제출 페이지에서 한 제출입니다.

관리자 제출은 관리자 아이디로 한 제출입니다.

기록을 남기지 않는 재채점과 기록을 남기는 재채점은 하단의 재채점에서 설명합니다.

FIFO로 채점을 합니다. 위의 1, 2, 3, 4는 FIFO 큐와 동일하게 동작하며, 큐의 동작을 코드로 설명하면 다음과 같습니다.

재채점

데이터의 추가, 변경, 수정등과 같은 다양한 이유로 인해 재채점을 하게 됩니다.

재채점은 데이터를 수정한 시점까지 제출했던 모든 제출을 재채점하게 됩니다.

재채점은 기록을 남길 수도 있고, 남기지 않을 수도 있습니다. 기록을 남기는 경우에는 재채점 현황 페이지를 통해서 이전 결과와 바뀐 결과를 안내합니다.

대부분의 재채점은 기록을 남기지만, 다음과 같은 경우에는 기록을 남기지 않을 수도 있습니다.

  • 유저의 제출이 없고, 관리자의 제출만 존재함
  • 재채점을 요청한 사람만 해당 문제를 제출했고, 관리자와 기록을 남기지 않기로 합의함
  • 대회 중 재채점 (업데이트를 통해 대회 중 재채점도 기록을 남길 예정)
  • 채점 프로그램의 오류로 인해 에서 벗어나지 못한 경우의 재채점 (결과의 변동이 없기 때문)

기록을 남기는 재채점은 을 거치지 않고, 채점된 결과에서 바로 재채점을 하게 됩니다. 기록을 남기지 않는 재채점만 으로 결과를 변경합니다.

채점 결과

  • : 채점을 기다리는 중입니다. 조금 기다리면 채점 결과를 받을 수 있습니다.
  • : 재채점을 기다리는 중입니다.
  • : 채점 프로그램이 채점을 하기 위해 여러가지 작업을 수행하는 중 입니다. 소스 코드 컴파일, 실행 환경 세팅 등이 포함됩니다.
  • : 채점을 하는 중입니다.
  • : 제출한 프로그램이 모든 데이터를 맞은 경우에 받게 됩니다.
  • : 답을 올바르게 구했으나, 문제에 나와있는 출력 형식과 다른 경우입니다. 다음은 이 결과를 받게 되는 일부 예시입니다.
    • 줄 뒤에 의미 없는 공백을 출력하는 경우. 단, 공백 한 칸은 무시하고 채점합니다. 예를 들어, "1 2"를 출력해야 하는 경우에 "1 2""1 2 "를 받게 됩니다. "1 2  "는 공백 두 칸을 뒤에 출력해서, " 1 2"는 첫 문자가 공백이라서, "1  2"는 두 수를 공백 두 칸으로 구분했기 때문에, 를 받게 됩니다. 여기서 "는 공백을 보기 위해 편의상 삽입한 기호입니다.
    • 의미없는 빈 줄을 삽입하는 경우. 예를 들어, 1부터 N까지 한 줄에 하나씩 출력해야 하는 경우에 1부터 N을 한줄에 하나씩 공백으로 구분해서 출력하는 경우는 를 받게 됩니다. 이것은 사이트가 생겼을 때 부터 있던 채점 시스템의 버그로 수정될 예정입니다. 각 줄의 사이에 빈 줄을 출력하는 경우에는 를 받게 됩니다.
  • : 출력 결과가 정답과 다른 경우입니다.
  • : 프로그램이 제한된 시간 이내에 끝나지 않은 경우입니다. 시간 제한을 초과하면 실행을 즉시 중단합니다. 따라서, 정답이 맞았는지 틀렸는지는 알 수 없습니다.
  • : 프로그램이 허용된 메모리보다 많은 메모리를 사용한 경우입니다. 와 마찬가지로, 메모리 제한을 초과하면 실행을 즉시 중단합니다.
  • : 프로그램이 너무 많은 출력을 하는 경우에 발생합니다. 이 결과는 와 같은 의미를 갖습니다. 정확하게는 미리 구해놓은 정답 파일 크기의 2배를 넘어가면 이 결과를 받게 됩니다. 만약, 출력하는 부분이 무한 루프에 빠진 경우, 시간을 초과하기 전에 를 받을 수 있습니다.
  • : 프로그램이 비정상적으로 종료한 경우입니다. Exit code가 0이 아닌 경우, segmentation fault를 받은 경우가 대표적입니다.
  • : 컴파일에 실패한 경우입니다. 경고(Warning)가 있어도 컴파일에 성공하면 이 결과를 받지 않습니다. 를 클릭하면 컴파일 에러 메시지를 볼 수 있습니다.
  • : 채점을 할 수 없는 경우입니다. 주로 예전에는 채점을 할 수 있는 언어였지만, 지금은 채점을 할 수 없는 경우에 이 결과를 받게 됩니다.
  • : 여러가지 이유에 의해서 삭제된 제출입니다.

채점 데이터

채점 데이터는 공개하지 않습니다.

채점 데이터의 개수, 채점 데이터 순서는 모두 공개하지 않습니다.

페이지에 나와있는 예제는 채점할 수도 있고, 채점하지 않을 수도 있습니다. 문제마다 다르게 값이 설정되어져 있으며, 기본값은 예제 채점입니다.

문제의 출처에 채점 데이터가 있는 경우, 이 데이터를 사용할 수도 있고 사용하지 않을 수도 있습니다. 채점 데이터는 공식 데이터와 다를 수도 있습니다.

채점 데이터 순서

채점 데이터 순서는 문제마다 다릅니다. 기본값은 입력 데이터 크기의 내림차순입니다. 데이터 순서는 아래와 같이 3가지가 있습니다.

  1. 입력 데이터 크기의 내림차순, 같은 경우에는 파일명의 오름차순
  2. 입력 데이터 크기의 오름차순, 같은 경우에는 파일명의 오름차순
  3. 랜덤

순서는 공개되지 않으며, 변경되더라도 변경 사실을 알리지 않습니다.

시간 제한과 메모리 제한

일부 언어는 문제에 써 있는 시간보다 큰 시간 제한/메모리 제한을 갖습니다. 이 값은 언어 도움말에서 볼 수 있습니다.

일부 문제의 일부 언어는 언어 도움말에 적힌 값을 사용하지 않습니다. 이런 경우에는 문제에 적혀있습니다.

수행 시간과 사용한 메모리

수행 시간은 각 데이터를 입력했을 때, 프로그램이 실행된 시간의 최대값이며, ms(1/1000초)를 사용합니다.

사용한 메모리는 각 데이터를 입력했을 때, 사용한 메모리의 최대값이며, KB를 사용합니다.

예를 들어, 어떤 제출이 각각의 데이터에서 32MS, 28MS, 44MS, 16MS가 걸렸다면, 이 제출의 수행 시간은 44MS입니다.

시간 누적 문제는 수행 시간이 프로그램이 실행된 시간의 합입니다.

예를 들어, 어떤 제출이 각각의 데이터에서 32MS, 28MS, 44MS, 16MS가 걸렸고, 이 문제가 시간 누적 문제었다면, 이 제출의 수행 시간은 120MS입니다.

함수 구현 문제의 수행 시간은 함수의 수행 시간입니다. 입/출력에 걸리는 시간을 제외하기 위해서 아래의 2번 시간 - 1번 시간을 사용합니다.

  1. 유저가 구현한 함수를 호출하지 않았을 때 걸린 시간
  2. 유저가 구현한 함수를 호출했을 때 걸린 시간

데이터의 추가/삭제/변경

일부 문제는 데이터 형식이 문제의 입력 형식과 다를 수도 있습니다. 이런 일이 벌어지는 이유는 다음과 같습니다.

예전에는 프로그래밍 대회에서 사용할 수 있는 언어가 대부분 C, C++, Pascal 이었습니다. 이 세 언어는 데이터의 형식을 엄격하게 지키지 않아도 올바르게 입력을 받을 수 있습니다. 예를 들어, 다음 세 가지 입력 형식은 모두 같은 소스 코드로 입력받을 수 있습니다.

  • 총 N개의 줄에 정수가 하나씩 주어진다.
  • 첫째 줄에 N개의 정수가 공백 한 칸으로 구분되어져 있다.
  • N개의 정수가 주어진다. 정수는 공백, 빈 칸, 탭으로 구분되어져 있으며, 그 개수는 한 개 이상이며, 섞여있을 수도 있다.

따라서, 입력 형식을 완벽하게 지키지 않아도 입력을 받는데는 큰 문제가 없는 경우가 많기 때문에 이렇게 입력 형식을 엄격하게 지키지 않는 경우가 발생합니다.

다른 이유로는 데이터를 만들 때 부주의한 경우가 있습니다.

C++을 이용해서 "첫째 줄에는 자연수의 개수 N, 둘째 줄에는 N개의 정수가 공백 한 칸으로 구분되어져 있는 데이터"는 다음과 같은 소스 코드로 만들 수 있습니다.

위와 같은 코드로 데이터를 만들면, 둘째 줄의 마지막 문자는 공백이 됩니다.

둘째 줄을 한 줄을 입력받고, 공백으로 나눠서 배열로 만들고, 배열의 각 값을 정수로 파싱하는 방식을 입력을 받을 수 있습니다. 하지만, 이 경우에는 배열의 마지막 값이 빈 칸이기 때문에, 정수로 변환할 수가 없어 를 받게 됩니다.

이런 경우는 데이터 제작자의 잘못이기 때문에, 게시판을 통해 제보하면, 수정해서 재채점을 하게 됩니다.

위의 데이터를 올바르게 만드는 C++ 코드는 아래와 같습니다.

를 받아야 하는 소스 ()인데 를 받은 경우 게시판을 통해 제보하면, 수정 또는 삭제해서 재채점을 하게 됩닌다.

를 받아야 하는 소스 ()인데 를 받은 경우 게시판을 통해 추가할 저격 데이터와 함께 제보하면, 추가해서 재채점을 하게 됩닌다.

기타

데이터는 문제에 나와있는 조건을 항상 지킵니다. 따라서, 입력을 검증할 필요는 없습니다.

채점 준비중 문제는 데이터가 없거나, 볼 수만 있는 문제라서 채점을 할 수 없는 경우입니다. 단, 문제 본문은 볼 수 있습니다.

삭제 문제는 데이터가 없거나, 본문 업로드가 아직 되지 않은 문제입니다. 데이터를 만들거나, 문제 본문은 업로드하면 공개됩니다.