2021 Kaupc 한국항공대학교 프로그래밍 경진대회 개최 후기
올해 11월 6일 열렸던 한국항공대학교 프로그래밍 경진대회를 개최한 후기를 남겨두려 한다.
자세한 진행과정은 시간이 날 때 꼭 다음 대회 개최자, 또는 대학에서 처음 프로그래밍 대회를 열어보려는 분들을 위해 따로 카테고리를 만들어 단계별로 상세히 적어 남겨두겠다!
문제 보기 : https://www.acmicpc.net/category/detail/2838
1. 시작
대회의 시작은 자그마치 2년 전.. 2019년 shake! 대회 오프라인 본선에서 교내 대회를 통해 올라온 다른 학교 본선 참가자들이 나름 친한 것?이 너무 부러웠다. 그래서 나는 졸업할 때까지 목표를 "첫 번째 교내 프로그래밍 대회 개최!"로 정했고, 우선 실력이 부족해 공부를 하기로 했다.
그러던 중 1학년 겨울방학때 백준 오프라인 강의(최근에 들었는데, 이게 아직까지 백준님 마지막 오프라인 강의라는..)에서 백준님한테 "교내 대회 열껀데 어떻게 해야 하나요?"라고 물어보았고, 백준님은 "같이해줄 실력자가 꼭 필요해요!"라고 말씀하셨던 기억이 난다.
그래서 좀 더 실력을 키우고, 2학년때 교내 알고리즘 학회를 만들었다. 이때 백준 학교 랭킹을 뒤져보며 상위권에 계신 분들에게 많이 접촉을 시도했다.. shake! 대회 때 봤던 분은 어떻게 단톡방에서 찾아서 친추 걸고,, 백준 상태 메시지에 블로그 써두신 분들은 찾아가서 댓글도 달면서 교내에 숨겨진 무림 고수들을 많이 데려왔던 것 같다. 나의 개인 능력보다는 주변 사람들이 더 중요했고, 당시엔 조금 무모했지만 지금 와서 생각해보면 참 잘했다고 생각한다.
그렇게 학회 운영도 열심히 했고, 마침 운이 좋게 학과 학생회장이 정말 일을 잘해서 올해 1월부터 대회 구상이 시작되었다.
2. 대회 구상
우선 대회를 열고싶다고 말씀드리기 위한 대회 전반적인 내용이 담긴 문서를 만들어야 했다.
대략적인 날짜, 대회의 목적, 세부 사항, 진행은 어떻게 할 것인지 등을 적었고 그 과정 속에서 대회 문제를 출제해주실 사람들을 찾았다.
대회 출제자 선정에는 내 나름의 규칙이 있었는데, 첫 교내 대회이니만큼 모든 출제진을 꼭 학교 재학생, 졸업생으로 꾸리고 싶었다. 따라서 어떻게든 과거에 엄청 잘하셨던 졸업생분들께 모두 메일 등으로 연락을 해보았지만.. 전부 거절하셨다 ㅠㅠ
최후의 통첩으로.. 이 분야 전문가이신 학교 교수님께 부탁드렸고, 교수님께선 검수를, 그리고 koosaga님이라는 엄청난 거물을 출제진으로 섭외해주셨다. 😱 이번 대회 문제 구성에서 정말 많은 도움을 주셨는데, 아래서 또 설명할 예정이다.
문서로 쓰지 않은 실질적인 대회 구성 (성격, 예산안, 대회 준비 등)은 Acka 님의 글을 많이 참고해서, 각 항목에 대해 어떻게 할지 notion에 정리했었다.
Acka 님의 글 : https://www.secmem.org/blog/2019/07/21/10-things-for-programming-contest/
3. 문제 구성 및 제작
문제를 내기 전에 파악해야 할 점들은 wookje님의 글을 보고 많이 배웠다.
wookje님의 글 : http://wookje.dance/2019/08/29/how-to-make-problem/
이 부분에 대해서는 이 글에 써도 될 것 같은데, 운영진들이 생각한 문제 구성 전에 생각한 부분은 다음과 같다.
1) 참가자의 실력
백준 "한국항공대학교" 랭킹에서 확인된 재학생 및 알고리즘 학회원들을 바탕으로 상한, 하한을 정했다.
상한 - ~ 코드포스 민트(~1600) 상위
하한 - 기본 언어 (입출력, 조건 반복) 올솔브 방지 문제를 풀 수 있는 정도
→ solved.ac 기준 플래티넘에 해당되는 문제들은 대회 때 0솔브가 나올 가능성이 크다.
결과적으로 이후 나올 스코어보드를 보면, 대부분 이 범위 내에서 움직였다고 생각한다.
2) 출제진의 실력
교내 출제진 3명 (코포 블루, 오렌지, 그레이?)였고, 3명 모두 대회 문제 출제 경험이 없었기 때문에 이 부분을 정리하면서 교수님께 도움을 요청드렸었다.
+) 외부 출제진 koosaga
3) 검수진의 실력
이 부분은 백준 홍보 게시판에 검수진 구해요~ 하면 된다. 선착순으로 받았는데 모두 내가 평가하기 힘들 만큼 뛰어나신 분들이었다.
4) 알고리즘 종류
처음에 그리디 알고리즘 문제는 난이도 구분이 힘들다고 들어서 웬만하면 지양하려고 했다. 결과적으론 한 문제 냈고, 이번 대회 목적에 가장 알맞은 문제였다고 생각한다.
필수로 들어갔으면 하는 문제들
- 기본 문제 (노솔브 방지 문제)
- 만만한 dp 또는 그래프 유형의 문제
- 시뮬레이션 유형 문제 (알고리즘을 몰라도 풀 수 있는 문제)
문제를 만들 때 추천할 만한 알고리즘들
이분 탐색, 투 포인터, 세그트리, 행렬 거듭제곱 dp, 비트필드를 이용한 dp
문자열, 정수론, 누적합, dfs/bfs, 우선순위 큐, set/map(집합, 맵을 이용한 해시), 슬라이딩 윈도우
안 냈으면 하는 문제들
단순 문자열 파싱, bigint, 소수점 몇 자리 정확히 출력하는 문제. (특정 언어가 다른 언어에 비해 문제를 풀기 쉬운 문제들)
5) 목표 문제 수와 난이도 커브
목표
참가자에 의해 모든 문제가 풀리되, 한 팀이 모든 문제를 푸는 것은 되도록이면 지양하려 하였다.
결과적으로 1등 팀이 올솔브하였지만, 이 팀을 제외하면 모든 문제가 풀릴 수 없었기 때문에 개인적으로 난이도 커브는 완벽했다고 생각한다.
목표 문제 수
6~7문제 (문제 선별 과정에서 결정하려고 하였다.)
난이도 커브 (solved.ac 기준입니다.)
브론즈 1~2
실버 1~2
골드 3~4
플래티넘 0~1
내가 브론즈 1 정도 문제를 실버 2 수준의 문제로 바꿔버려서 기존에 계획했던 커브에서 살짝 어긋났다. 문제 수정 과정에서 의식의 흐름대로 바꾸다 보니 브론즈 문제가 1문제만 나왔고,, 이 부분은 내가 실수했다.
문제 아이디어를 내는 선제 기간을 약 2~3주간 잡았고, 투표를 통해 고득점을 받은 문제들을 우선순위로 선택 후 나름의 밸런스 조정을 통해 대회에 출제할 문제들을 정했다.
이후 문제 제작은 Polygon에서 진행하였고, 여기서 문제 지문, test case generator, validator 등을 만들었다. 2주 정도 잡았다.
이때도 koosaga님이 공유해주신 예시 문제들을 열심히 참고해서 Polygon 사용법을 익힐 수 있었다. 다행히도 올해 문제 데이터가 생겼으니 내년 교내 대회 때는 잘 써먹을 수 있을 것 같다.
그 이후 검수 기간을 1주일로 잡았고, Polygon에서 검수진들의 코드를 모두 추가했고 폭풍 피드백이 이어졌다...
마지막으로 백준(startlink) 측에 연락했고 BOJ Stack에 문제를 옮김과 동시에 설명이 부족한 문제들에 대한 예시 테스트 케이스 추가 및 사진 등을 추가하는 과정을 거쳤다.
예상보다 많은 시간이 걸렸고, 처음부터 나와 같이 작업한 우리 교내 출제진들의 경우 약 한 달 반 동안 작업이 지속되었다. 다들 처음이라 많이 고민할 수밖에 없었고, 점점 시간 연장을 했던 탓이었다. 경험이 많은 운영진이 있지 않는 이상, 시간을 정말 넉넉히 (2배 이상?) 잡고 가시는 걸 추천한다.
4. 대회 결과
총 24팀(72명)이 신청했고, 실제로 대회에 참여한 팀은 23팀(69명)이다. 놀랍게도 한 팀을 제외하고 모두 참여해주셔서 정말 감사했다.
그리고 상당히 기분 좋은 스코어보드가 나왔다.
우리 학교 수준을 모르시는 koosaga님도 대회 종료 후 스코어보드 상 난이도가 괜찮았다고 말씀해주셨는데 기분이 좋았다.
교내 출제진 모두가 미쳐버린 헬셋 대회들에 대한 트라우마가 있고, 참가자분들을 최대한 고려해서 난이도를 조정했기 때문에 이루어낸 결과가 아닌가 싶다. 물론 문제 자체에 대한 아쉬움은 정말 많지만, 첫 대회치고 결과가 좋았다. 이 부분은 내년 대회에 참여하게 되면, 피드백을 해줄 예정이다.
5. 마치며
대학에서 첫 프로그래밍 대회를 여는 데에는 많은 노력과 운이 필요하다.
우선 프로그래밍 대회가 무엇인지 물어보시는 교수님들, 예산과 관련된 학교 사람들을 설득해야 하며 그러다 보면 나는 모든 상황에서 을이 되어있다. 출제, 검수진 등 많은 사람들에게 부탁을 드려야 하고, 메일을 보내고 그 답이 올 때까지 일단 기다려야 한다.
대회에 들이는 시간 대비드릴 수 있는 금액은 한정적이기 때문에 관련된 많은 사람들에게 미안해지고, 괜히 내가 잘못한 것 같았다.
괜히 한 번 성질내면 많은 사람들의 노력이 없어질까 봐 매번 낮은 자세를 유지했고, 문제에 오류가 있나 싶어서 자다가 깨서 테스트 케이스를 만들어 돌려본 적도 있다. 물론 내가 잘 못해서도 있겠지만, 힘든 건 확실하다.
그래도 대회를 무사히 마쳤다는 기쁨이 더 컸고, 절대 후회하지 않을 경험이라 생각한다.
나중에 나처럼 첫 대회를 열거나, 사라진 대회(?)를 부활시키시려는 분이 있다면 꼭 노력해서 끝까지 해내셨으면 좋겠다. 파이팅! 🙋♂️