문제 검수 체크리스트

⚠️ 이 글은 더 이상 업데이트가 되지 않습니다. 하지만 댓글로 추가할 내용을 제안하시면 반영하겠습니다.

검수 시스템

  • 보통 대회 검수를 위한 슬랙이나 디스코드 서버를 만들게 될 텐데, 이때 문제별로 채널을 하나씩 만들어 주세요.
  • 다음 검수 시트(링크)를 활용하면 좋습니다. (추가 예정)

지문

  • UCPC 디스크립션 작성 및 포매팅 컨벤션(링크)
  • BOJ 스택 문제 안내(링크)
  • 조금이라도 헷갈리는 게 있으면 곧바로 코멘트를 다세요. 절대로 대충 이해하고 그냥 넘어가면 안 됩니다. 그 헷갈리는 부분이 알고보니 실제로 문제가 있는 부분일 가능성이 높습니다. 중의적인 문장이거나, 빠진 조건이 있거나, 그냥 이상하게 썼거나...
  • 변수의 대소문자 사용과 포맷팅(이탤릭, LaTeX, ...)이 통일되어 있나요?
  • 지문에서 든 예시가 올바른가요?
  • 문제(지문이나 입출력 조건)가 수정되면 반드시 통보되어야 하고, 검수도 반드시 다시 해야 합니다. 조건을 바꿨는데 밸리데이터를 안 바꾸는 바람에 데이터가 틀릴 수도 있고, 수정된 지문이나 조건이 이상해서 또 수정되어야 할 수도 있습니다.

입출력 조건

  • 모든 것에는 범위가 필요합니다. 최솟값과 최댓값이 문제에 명시되어 있거나, 지문으로부터 직/간접적으로 알아낼 수 있나요?
  • 모든 것에는 타입이 필요합니다. 예를 들어, $n$은 정수인가요? 그 내용이 문제에 명시되어 있거나, 지문으로부터 직/간접적으로 알아낼 수 있나요?
  • 스페셜 저지가 있고 "가능한 답이 여러 가지일 경우, 그중 아무거나 출력한다"가 성립할 경우, 이를 명시하는 것을 권장합니다.

정수

  • $n$은 양의 정수인가요?
    • "자연수"라는 표현은 권장하지 않습니다. 자연수의 정의는 통일되어 있지 않습니다.
  • $n$은 음이 아닌 정수인가요?
  • "32비트 정수"라는 표현은 권장하지 않습니다. 32비트 정수의 범위는 시스템마다 다릅니다.
    • "int 범위"라는 표현은 더더욱 권장하지 않습니다.

실수

  • 소숫점 아래 최대 (또는 정확히) 몇째 자리까지 들어오나요?

문자열

  • 문자열은 어떤 문자로 이루어져 있나요?
  • 문자열의 길이는 최대 몇인가요?

기하

  • 좌표는 정수인가요? (+ 위의 "정수", "실수"를 참조하세요.)
  • 좌표의 범위는 어디부터 어디까지인가요?
  • 다각형의 꼭짓점은 최대 몇 개인가요?
  • 다음 각각이 조건에 포함될 경우, 명시되어야 합니다.
    • 좌표가 같은 두 점이 없다.
    • 한 직선 위에 있는 세 점이 없다.
    • 두 선분이 겹치지 않는다.
    • 두 선분이 양끝에서 겹치지 않는다.
    • 평행한 두 선분이 없다.
    • 다각형은 볼록다각형이다.
    • 다각형은 단순다각형이다.

그래프

  • 정점에는 1부터 $n$까지 번호가 매겨져 있나요?
  • 간선에는 방향이 있나요?
  • 다음 각각이 조건에 포함될 경우, 명시되어야 합니다.
    • 정점에 가중치가 있다. (이 가중치의 조건에 대해서는 위의 "정수", "실수"를 참조하세요.)
    • 간선에 가중치가 있다.
    • 하나의 정점과 자기 자신을 잇는 간선이 없다.
    • 같은 쌍의 정점을 잇는 두 간선이 없다.
    • (간선에 방향이 없을 경우) 연결 그래프이다.
    • (간선에 방향이 없을 경우) 트리이다.
    • (간선에 방향이 없을 경우) 루트가 있는 트리이다.

풀이

  • Proof by AC로 퉁치면 절대 안 됩니다. 출제진과 검수진은 논문을 참고하거나 힘을 합쳐서라도 완전한 풀이를 증명을 포함하여 완성시켜야 합니다. 의외의 반례가 나올지도 모르는 일이죠.
  • 예제 또는 데이터에 끼워 맞춰서 풀면 절대 안 됩니다. 예제와 데이터가 진짜로 맞는지 확인하는 게 검수자의 역할입니다.

시간/메모리 제한

  • 특별한 사유가 없는 한, 메모리 제한은 512 MB 또는 1024 MB로 하세요. 후자를 권장합니다.
    • 특별한 사유로 한 문제의 메모리 제한을 매우 작게 설정해야 할 경우, 그 사항을 해당 문제에서 강조해 주세요. (예시)
  • 시간 제한은 (1) 통과되어야 하는 옳은 풀이와 (2) 막아야 되는 비효율적인 풀이를 고려하여 책정합니다.
    • 가장 이상적인 경우는 (1)의 풀이가 모두 넉넉하게 통과되면서 (2)의 풀이가 안정적으로 틀리는 경우입니다.
    • 그런 경우가 불가능하면 (즉 (1)과 (2) 사이 갭이 너무 작으면) 입력 제한을 늘리는 방법이 있습니다. 그것마저 불가능하면... 행운을 빕니다.

데이터 검증

  • 데이터 검증 코드 소홀히 하지 마세요!!! 검수하세요!!!!! 검수 안 했다가 잘못된 데이터가 들어가기 정말 쉽습니다. 실제로도 여러 번 발생합니다.
  • 3명 이상이 검수하세요!!! 심지어 제대로 검수하기도 쉽지 않습니다. 저도 항상 이걸 검수하지만 틀린 부분을 굉장히 많이 놓칩니다. 아예 풀이에서 assert를 써서 다시 한 번 확인하는 게 나을 수도 있습니다.
  • 데이터 검증 코드는 문제에 있는 모든 조건을 빠짐없이 검사해야 하며, 문제에 없는 조건을 검사하면 안 됩니다. 설령 데이터 검증이 문제 풀기보다 어렵더라도 반드시 검증 코드를 작성해야 합니다.
  • fscanf보다 BOJ의 testlib 패키지를 권장합니다. 자세한 사용법은 BOJ Stack 페이지를 참조하세요.
  • 데이터 검증 코드에 오류는 없나요? 예를 들어 범위 밖의 인덱스를 참조하거나, 오버플로우가 나거나, 논리적으로 틀렸거나 하지는 않나요?
  • 문제의 조건이 바뀌면 데이터 검증 코드도 다시 검수하세요.

스페셜 저지

  • TODO

예제

  • 예제가 올바른가요? 스페셜 저지인 경우 특히 잘 살펴봅시다.
  • 예제에 대한 설명이 올바른가요? 굉장히 놓치기 쉽습니다. 꼼꼼하게 확인하세요.
  • 예제가 문제 이해에 충분히 도움이 되나요?
  • 예제가 눈으로 직접 확인할 수 있을 정도로 자명하지 않을 경우, 해설을 추가하는 것을 권장합니다.
  • 예시가 지문에 있을 경우, 예제로도 넣으면 좋습니다.

데이터

  • 입력/출력의 값/크기가 최소/최대인 데이터가 있나요?
  • 틀린 코드를 걸러낼 수 있을 정도로 충분히 강력한가요? 다양한 틀린 코드를 만들어 보세요. 틀렸다는 건 시간 초과, 메모리 초과 등도 포함됩니다.

수열

  • 최대 길이의 증가수열, 감소수열, 모든 원소가 같은 수열이 있나요?

그래프

  • 일직선 그래프(트리)가 있나요?
  • 차수가 N-1인 (또는 그 정도로 큰) 정점이 있는 그래프(트리)가 있나요?

대회 난이도

교내대회 등 신청을 따로 받는 대회에 해당되는 내용입니다.

  • 모든 참가자가 적어도 한 문제를 풀 수 있을 것으로 예상되나요? 컴퓨터공학과 전체를 대상으로 할 경우, 가장 쉬운 문제는 브론즈 5~4 정도가 좋습니다.
  • 1등 참가자는 몇 문제를 풀 것으로 예상되나요?
  • 전체적인 난이도 분포가 기획했던 분포에 맞나요?

대회 중 질문

  • 대회 자체나 BOJ 시스템에 대한 질문은 답변해도 상관없습니다. (예: "시간 제한을 벗어나도 틀렸습니다를 받나요?")
  • 참가자 코드의 틀린 점을 짚어주면 당연히 안 됩니다.
  • 지문에서 답변을 명확하게 알아낼 수 있으면 일반적으로 "문제를 다시 한 번 잘 읽어주세요." 같은 답변을 달고, 질문을 공개하지 않습니다.

오픈 컨테스트

  • 본대회 참가자는 오픈 컨테스트에 제출하지 말라고 공지해 주세요.

댓글 (4개) 댓글 쓰기


jyheo98 1년 전

곧 문제 검수를 맡게 될 거 같은데 좋은 글 미리 감사합니다.


dohoon 1년 전

문제 검수를 하고 싶은데 좋은 글 미리 감사합니다.


ai4youej 11달 전

좋은 글 감사합니다. 아래 두 의견도 반영되었으면 합니다.

  1. 음수를 양수로 나누는 정수 나눗셈을 해야한다면, 어떻게 해야하는지 명시해주세요.
  2. 최대 길이의 데이터가 존재하는지 확인해주세요.

man_of_learning 2달 전

정말 좋은 글인 것 같습니다. 참고 많이 되었어요. 감사합니다.