Codeforces 소개

언젠가 써야지라며 생각만 했는데 마침 다음 코드포스 대회까지 시간이 애매하게 남아서 글을 써봅니당


코드포스(http://codeforces.com)는 주기적으로 온라인 Competitive Programming 대회가 열리는 러시아 사이트로, 일주일에 2~3개 정도의 대회가 열리고 매 대회마다 대략 6000명 정도가 참여합니다. 


사이트는 굉장히 심플하게 생겼습니다. 오른쪽 상단에 다음 대회의 정보가 나와있고, 대회에 Register한 후 시간에 맞춰 사이트에 접속해 문제를 풀면 됩니다. 보통 2시간 5~6문제 정도이고 대회의 Division이 3개로 나누어져있어 본인의 실력을 나타내는 지표인 레이팅에 맞는 Division에서 대회를 진행하게 됩니다.



대회가 진행중일 땐 레이아웃이 대략 위와 같고, 문제를 열심히 읽고 풀면 됩니다. 문제애 대한 질문이 있으면 Ask a question 버튼을 눌러서 할 수 있습니다. 꼭 순서대로 풀 필요는 없으나 문제가 난이도 순으로 배열되어 있기 때문에 특별한 일이 없으면 순서대로 푸는 것이 가장 낫습니다. 문제의 배점은 차등이고 시간에 따라 감소합니다. 예를 들어 A번 문제가 500점이고 2시간 짜리 대회이면, 0분에 A번을 맞추면 500점을 획득하지만 60분에 A번을 맞추면 380점을 획득하고 120분에 A번을 맞추면 260점을 획득합니다. 또한 Wrong Answer를 받을 때 마다 그 문제의 배점이 50점씩 감소합니다.(단 원래 점수의 30% 미만으로 떨어지지는 않습니다.) 만약 A번 문제를 30분에 1번 틀리고 60분에 맞추면 330점을 획득하고, 10번 틀리고 120분에 맞추면 원래 점수의 30% 미만으로 떨어지지는 않으므로 150점을 획득합니다. 그렇기에 문제를 빠르고 정확하게 푸는 것이 굉장히 중요합니다. 자세한 스코어 시스템은 http://codeforces.com/blog/entry/456 를 참고해주세요.


또한 Codeforce에서는 Hack이라는 독특한 시스템이 있습니다. 대회 시간 내에 채점을 할 때에는 대략 15개 내외의 테스트 케이스로만 채점을 진행합니다.(이를 pretest라고 합니다.) 즉, 약한 데이터로 채점을 진행하기 때문에 실제로는 코너 케이스에서 오답을 내는 코드임에도 불구하고 Accepted될 수도 있습니다.(보통 int overflow나 n = 0, 1과 같은 예외에 걸리곤 합니다.) 이 때 참가자는 다른 참가자의 Accepted된 코드에 대해 오답을 내는 테스트 케이스를 찾을 수 있습니다. 이러한 테스트 케이스를 성공적으로 찾을 경우 100점이 추가되고, 실패했을 경우 50점을 잃게 됩니다. (단 컴파일 에러가 발생하거나 아예 첫 번째 테스트케이스부터 오답이 발생할 경우 점수를 감소시키지 않습니다.) Hack을 하기 위한 조건은 아래와 같습니다.


1. Hack을 할 대상이 나와 같은 Room에 속해있어야 합니다.(Room은 대회에서 임의로 배정해주는 그룹으로, 해당 그룹 내의 참가자에게만 Hack을 시도할 수 있습니다.)


2. 내가 pretest를 통과한 문제이고 lock을 해야 합니다.(lock은 pretest를 통과한 해당 문제의 제출을 더 이상 하지 않겠다는 선언입니다. lock을 해야 다른 사람의 코드를 열람하여 hack을 시도할 수 있지만, 대신 lock을 한 후에 hack을 당할 경우 더 이상 제출할 수 없습니다. 만약 lock을 아직 하지 않은 상태에서 hack을 당할 경우에는 코드를 재제출할 수 있습니다. 그리고 lock을 한 후에 hack을 당한 문제라고 하더라도 다른 사람의 코드에 대한 hack을 계속 시도할 수 있습니다.)



lock은 위의 자물쇠 아이콘을 클릭해서 할 수 있습니다.(A B는 이미 lock한 문제, C D는 아직 lock하지 않은 문제)



이는 Room의 인터페이스입니다. 제가 A에 lock을 걸었다고 할 때, 다른 사람의 A를 클릭하면 (예를 들어 arthurCF의 432/00:09라고 써진 칸)

 그 사람의 코드를 볼 수 있습니다. 단 복사 붙여넣기는 불가능합니다. 코드를 붙여놓고 퍼징으로 hack data를 찾는 것은 룰 위반입니다. 눈으로 살펴보고 문제가 생기겠다 싶은 테스트케이스를 찾으면 hack을 시도할 수 있습니다.


뭐 대충 이런 레이아웃이고 Hack!을 누르면 데이터를 입력할 수 있습니다.


Hack!을 누르고 반응이 한 동안 없는 경우가 많은데, 그럴 땐 F5를 계속 눌러주면 됩니다.



이후 Hack에 성공하면 Successful hacking attempt라는 메시지와 함께 100점을 받게 되고, 실패하면 Unsuccessful hacking attempt라는 메시지와 함께 50점을 잃게 됩니다. 만약 Invalid한 input을 넣으면 점수 차감이 이루어지지 않습니다. Hack을 당하게 되면 알림이 옵니다.

lock을 했으면 어쩔 수 없고, 해두지 않았으면 빠르게 코드의 문제점을 찾아 수정해야 합니다. hack당한 문제를 재제출할 때에는 hack data 또한 추가로 채점이 되기 때문에 재제출이 통과됐으면 일단 안심해도 괜찮습니다.(만약 문제점이 한 두가지가 아니었으면 어쩔 수 없지만요.)


대회가 종료된 이후, pretest를 통과한 코드들에 대해 60개 이상의 test case들로 다시 한번 채점이 이루어집니다.(이를 System test라고 부릅니다.) System test에서 통과하면 비로소 안심해도 됩니다.


한 가지 단점이 있다면, 러시아 시간대로 진행이 되다 보니 늘 밤 11시 이후에 대회가 있어 학기 중에는 부담이 상당하긴 합니다.


제가 맨 처음에 헷갈렸던 룰을 몇 가지 써보면

  • 이전에 내가 작성한 코드나 다른 곳에 공개되어있는 코드를 복붙하는 것이 허용됩니다. 만약 비슷한 문제를 이전에 본 것 같으면 정답 코드를 찾아서 복붙해도 상관이 없습니다.
  • hack을 안당하려고 코드를 의도적으로 난독화하는 것은 허용되지 않습니다. 사실 이건 애초에 본인에게 손해인게, 빨리 hack을 당해야 고칠 수 있으니까요.
  • 당연하겠지만 대회 중에 다른 참가자에게 코드나 아이디어를 제공받는 것은 허용되지 않습니다.

코드포스를 하면 문제의 조건을 정확하게 읽고 코너 케이스를 생각하는 능력이 많이 늘게 됩니다. 그리고 전형적인 문제에 대해서는 코딩 속도가 비약적으로 향상됩니다. Competitive Programming에 본격적으로 뛰어들 것이라면 코드포스에 꾸준히 참가하는 것을 추천드립니다!


  Comments