0. Introduction
'Professional way to prepare programming contest problem'
(프로그래밍 대회 문제를 준비하는 전문적인 방법)
세상에는 수많은 정보 문제들이 있습니다. 간단한 연산 문제부터 복잡한 알고리즘이 필요한 문제들까지, 다양한 문제들이 있지만 이들도 근본적인 공통점이 있습니다. 기본적으로 '문제'이기 때문에, description, input, output, 그리고 (주로 deterministic한) 정해 solution이 존재한다는 것이죠. 풀라고 만든 것이 문제니까요.
다만 이러한 정보 문제들이 잘 만들어졌는지는, 출제자의 책임입니다. 대체로 국제적인 대회에서는 팀으로 서로 의견을 나누고 지적해가며 문제들을 만들어내겠지만, 혼자서 문제를 만드는 경우도 생기기 마련이죠. 그 경우 문제의 검증은 어떻게 해야 할까요? 문제의 검증에는 생각보다 많은 요소들이 들어갑니다. Time limit, memory limit, input format, output, 허를 찌르는 test case, 그리고 합당한 description과 main solution 등등......이를 모두 다 확인하는 프로그램을 직접 만드는 것은 상당히 힘듭니다.
이런 측면에서 만들어진 Polygon이라는 사이트가 있습니다. Polygon은 널리 알려진 programming community인 Codeforces의 개발자 Mike Mirzayanov가 만든 사이트입니다. Polygon은 기본적으로 문제를 만들고, 관련 코드를 저장하고, 검증하고 수 있습니다. 여러 가지 기술적 장치를 통해 input이 올바른지, main solution이 올바른지, 혹시 countercase는 있는지, time limit안에 잘 돌아가는지를 판별할 수 있기 때문입니다.
Mike Mirzayanov가 Polygon을 만든 이유는 다음과 같습니다.
(이하 내용은 http://codeforces.com/blog/entry/14184 의 일부 번역입니다.)
1. Polygon은 오류를 방지합니다.
Input/Output이 올바른지, Input의 공백 및 개행 문자가 올바르게 들어가 있는지(특히 문자열 관련 문제에서 이는 중요해집니다), 문제 설명에 들어가 있는 IO Example이 실제로 문제의 Test 1으로 들어가 있는지(이건 일종의 불문율이자 배려이죠) 등을 방지할 수 있습니다.
2. Polygon은 문제를 정해진 규격의 zip 파일로 만들 수 있습니다.
저는 여러 대회에서 문제를 만들고, 또이를 배포할 때의 package의 표준 형식이 뭔지는 잘 모르겠습니다만, Polygon은 문제를 다 만든 후 Package의 형태로 Statement, Test, Checker, Validator, Solution 등의 출제자들이 만든 코드와 실행 배치 파일들을 하나의 zip 파일로 만들어 줍니다.
3. Polygon은 파일을 장기적으로 보존합니다.
문제를 만들면서 우리는 종종 코드를 덮어쓰기를 합니다. 이러면 과거의 코드 상태를 알 수가 없게 됩니다. Polygon은 여러 revision를 저장함으로써, 버전 비교 및 '아 이때는 이래서 잘 안 됐구나'하는 식으로 분석을 할 수 있습니다. 또, 이러한 revision은 얼마나 문제를 만들었는가를 알려주는 이정표가 되기도 합니다.
4. Polygon은 프로그래밍 문제 만들기의 장벽을 낮춰 줍니다.
Polygon은 서버 관련 지식 없이도 사용할 수도 있고, 전 세계 각국에서 만든 사용자들이 똑같은 양식으로 문제를 만들 수 있게 해 상호적인 참조가 무리 없이 가능합니다.
5. Polygon은 문제 접근을 관리할 수 있습니다.
Polygon에 등록된 아무 계정에게나 자신의 문제를 공유할 수 있습니다. 이는 문제를 만드는 사람들끼리 협업할 수 있다는 뜻도 되며, 또 타인에게 문제를 내서 추가적인 피드백을 받을 수 있다는 뜻도 됩니다.
6 . Polygon은 문제점을 올릴 수 있습니다.
흔히 Issue tracking이라 불리죠. 문제를 혼자 만들든, 같이 만들든 이는 매우 좋은 기능입니다. 서로의 문제점 및 버그를 지적할 수 있고, 진행 상항을 공표할 수도 있으며, 문제의 방향성을 유지하는데 공헌하기 때문입니다.
7. Polygon은 Online Judge랑 쉽게 통합 가능합니다.
2번이랑 일맥상통한데, Polygon의 Package는 기계가 읽고 처리할 수 있도록 짜여졌기 때문에 쉽게 Online Judge에 그 Package를 올리면 굳이 손으로 수많은 Test를 복붙할 필요가 없게 됩니다.
8. Polygon이 없다면 복잡한 소프트웨어들이 필요합니다.
직접 우리의 컴퓨터에서 한다면 LaTeX로 작성된 Statement를 자동으로 파일로 출력해주는 프로그램, 여러 언어(C++, Java, Python 2&3 등......)들의 소스 코드를 받아서 실행 및 결과를 내놓는 프로그램이 필요하고, 이는 상당히 기술적인 부분을 요구하며 까다롭습니다.
9. Polygon은 보다 안전합니다.
https를 쓰고, 그 외 복잡한 암호화를 쓰는 것 같습니다.
10. Polygon은 문제들을 분류할 수 있습니다.
태그와 필터, 검색 등으로 500문제들 속에서 원하는 문제들을 쉽게 찾을 수 있습니다(라고 개발자님께서 말씀하시는군요).
아무튼 이러한 기능들을 가진 Polygon이고, 실제로 사용하다 보면 그 강력함에 놀라지 않을 수 없게 됩니다. 실제로 Codeforces에 올라가는 문제들도 다 이 Polygon으로 만들어집니다(Mashup Contest에 본인이 만든 Polygon 문제를 올릴 수 있는 모양이지만, 저는 잘 모르겠습니다). 다만 마음에 걸리는 점이 몇 가지 있습니다.
1. 업데이트가 2011년에 멈췄다......는 아닙니다.
Polygon의 update log는 2011년에 멈추어 있는 것이 사실이지만, 몇 달마다 약간의 개선은 가해지고 있습니다.
2. 진입 장벽이 결코 낮지 않습니다.
일단 "testlib.h"라는, 이분이 직접 만드신 헤더 파일을 이용해서 코딩도 해야 하고, LaTeX를 html로 바꾸는 과정에서는 또 #begin{enumerate}나 #indent 같은, 비교적 간단한 구문도 사용하지 못하고, 어떤 파일을 먼저 만들어야 하는지 설명도 없고...... 아무튼 진입장벽이 낮다 할 수는 없습니다. Polygon 내의 도움말도 빈약하고요. 물론 여기에서 더 자세한 도움을 받을 수 있긴 합니다.
3. 그리고 영어......
뭐 Codeforces Contest를 해석할 정도면 충분하지만, 일단 영어입니다. 네.
실제로 도움말이 거의 없습니다. Google에 codeforces polygon 쳐도 딱히 유익한 정보가 많이 나오지도 않고요. 영어로도 거의 없는데, 한국어로는 더욱 더 없겠죠. 그래서 약간의 가이드라인이라도 될 수 있는 포스팅을 해보자는 것이 저의 목적입니다.