Leetcode 대회 문제 출제 및 검수자의 짧은 이야기

나는 최근 반년 정도 리트코드 콘텐츠 팀에서 대회 문제 출제, 검수, 해킹을 하고 있다. 오랜만에 리트코드 대회 코디네이터로서의 작업에 대해 이야기해보고자 한다.

우선 이 역할에 지원한 이유는 단순한 호기심이었다. 리트코드 대회에 꾸준히 참가한 지 3년이 넘었고, 그동안 한국 1등, 글로벌 2등 등 다양한 순위를 경험했다. 참가자의 시각에서 보는 대회 대신 운영자의 시각에서 대회를 이해해보고 싶었다. 그러던 중 우연히 인터뷰 기회를 얻게 되었고, 콘텐츠 팀 매니저와 인터뷰를 통해 합류하게 되었다. 아마도 리트코드 외에도 해커컵, 코드잼, 킥스타트 등 여러 대회에서 좋은 성적을 유지했기 때문에 이 기회를 얻게 된 것 같다.

주로 내가 맡은 역할은 대회 문제 검수 및 해킹이다. 매주 열리는 Internal Contest에서 2시간 안에 8문제를 풀어야 한다. 1문제의 Easy, 3문제의 Medium, 3문제의 Hard, 1문제의 Mid-hard로 구성된다. 문제를 풀고 나면 본격적인 검수가 시작된다.

검수 과정에서는 문제와 솔루션 모델의 설계가 적합한지, 지문에 모호한 부분이 없는지, 예제와 미디어 정보가 문제 설명과 일치하는지 확인한다. 출제된 문제를 참가자가 명확하게 이해할 수 있도록 설계되었는지 검토하는 것이 핵심이다.

그다음에는 문제를 해킹한다. 사실 이 부분이 개인적으로 가장 흥미롭다. 문제의 테스트케이스가 적절한지, 의도하지 않은 솔루션으로 문제가 풀리지 않는지 확인하는 것이다. 예를 들어, DP로 풀어야 하는 문제에서 Greedy 알고리즘으로도 풀이가 가능한지 검토한다. 만약 더 적은 시간 복잡도의 Greedy로 풀린다면 해당 솔루션이 허용되는지를 증명한 뒤 리포트하고, 허용되지 않으면 이를 방지할 테스트케이스를 추가한다.

또한, 솔루션의 알고리즘을 기반으로 사용자들이 실수할 수 있는 부분을 잡아내는 테스트케이스가 있는지도 확인한다. 경계값 테스트, 자료형 테스트, 잘못된 메모리 할당, 풀이 알고리즘의 취약점, 테스트케이스 자체의 취약점 등 여러 방면에서 문제를 해킹하려고 시도한다.

검수자는 문제의 시간 복잡도를 기준으로 제약 사항이 적절하게 설정되었는지도 확인해야 한다. 예를 들어, 문제 출제자가 목표로 삼은 시간 복잡도가 O(n^2)라면, O(n^2) 이상의 시간 복잡도를 가진 솔루션이 통과되지 않도록 제약 조건을 설계해야 한다. 이 과정은 C++뿐만 아니라 다양한 언어에서 확인되며, 특정 언어에서 통과되지 않는다면 이를 리포트해 수정 방향을 제시해야 한다. 특정 언어군에서 동일한 시간 복잡도를 가진 코드가 AC를 받지 못한다면 해당 이슈를 리포트해야 한다. 따라서 여러 언어에 대한 적어도 기본적인 이해가 필요하다.

또 다른 중요한 역할은 출제자의 의도와 다른 솔루션이 존재하는지 확인하는 것이다. 만약 O(nlogn) 복잡도를 목표로 한 문제에 O(n) 솔루션이 존재한다면, 이를 증명한 후 리포트해야 한다. 이때 제약 조건을 수정하거나 시간 제한을 변경하는 등 개선 방향을 제시한다.

리포트된 내용은 팀 매니저와 논의되며, 문제가 개선되거나 새로운 문제(문제 뒤에 I, II, III가 붙는 경우)가 출제될 수 있다. 이러한 문제는 다시 검수 절차를 거쳐 대회에 공개된다.

팀은 대부분 전 세계에서 알고리즘 대회에 대한 경험이 많은 사람들로 구성된다. ICPC 운영자 및 우승자, Codeforce 상위 랭커 등 알고리즘에 관심이 있는 사람들이라면 누구나 알고있는 대회들에서 알고리즘 경쟁자로 활동한 사람들을 팀에서 자주 볼 수 있다. 아마 내가 가장 쩌리인 느낌이다. 이런 사람들과 같이 일을 해야하고 문제를 해킹해야 하기 때문에 알고리즘에 대한 지식이 절대적으로 필요하다.

마지막으로 이야기할 부분은 베네핏이다. 가장 의미있는 부분은 내가 검수한 문제가 대회에서 출제된다는 부분이다. 특히나 내가 해킹하거나, 개선한 문제가 대회에서 출제되어 AC를 받은 사람이 적으면 묘한 성취감을 느낀다. 또한 전 세계 수만 명이 사용하는 네임밸류 있는 플랫폼에 내가 기여하고 있다는 뿌듯함도 크다.

검수자들은 리트코드 프리미엄이 무료로 제공되고 Internal contest를 참여할 때마다 일반 대회에서 얻기 힘든 양의 리트 코인이 지급된다. 이 리트 코인으로 리트코드 굿즈뿐만 아니라 내부자에게만 제공되는 히든 굿즈와도 교환할 수 있다. 물론 히든 굿즈는 일반 굿즈보다 더 많은 리트 코인이 필요하다. 또한, 검수한 문제에 따라 페이팔로 보상이 지급되는데, 와이즈 같은 다른 방법도 가능하지만 한국에서는 제약이 많아서 나 역시 페이팔을 사용하고 있다. 다만 페이팔은 수수료가 너무 많이 떼이는 것이 아쉬운 부분이다. 리트코드 팀 내에 한국인이 나밖에 없어 이런 문제를 상담할 사람이 없는 점도 불편하다.

또 하나의 제약 사항은 우리 같은 검수자는 리트코드 대회에 참여할 수 없다는 점이다. 당연한 일이지만, 미리 문제를 출제하고 검토한 내용을 알고 있기 때문에 공정한 대회가 될 수 없다. 만약 대회에 참여한다면 문제를 모두 푸는 데 3분도 걸리지 않을 것이다. 하지만 대회에 대한 감각을 유지해야 하기 때문에 내부 콘테스트에 참가하는데, 여기서는 더 많은 문제, 더 어려운 문제, 더 짧은 제한 시간으로 진행되므로 일반 리트코드 대회보다 훨씬 긴장감 있게 참여할 수 있다.

이 포스트를 작성하게 됨으로써 리트코드에 기여하고 싶은 한국인 들이 많아지길 바라며 이 글을 마친다.

Author: Song Hayoung
Link: https://songhayoung.github.io/2024/10/19/DayLife/20241019/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.