<

CP/대회 후기

INU 코드페스티벌 2023 개최 과정 + 후기

leedongbin 2023. 12. 20. 05:12

예산 마련부터 출제/검수과정, 심지어 대회 도중에까지 정말 우여곡절이 많았지만, 어떻게든 무사히 교내(?)대회를 마쳤다.

내년에 혹시 열릴지도 모르는 INU 코드페스티벌 2024를 위해, 대회 운영의 모든 과정과 유의사항, 운영 과정에서 발생했던 문제점들을 타임라인 순으로 전부 기록해두려고 한다. 혹시 교내대회 개최를 생각 중인 분들이 있다면 도움이 되었으면 좋겠다.


1. 계획안 작성, 예산 확보 - 10/10 ~ 10/13

기존 교내대회는 인천대학교 공학교육혁신센터에서 주관했었는데, 어째서인지 작년부터 예산이 끊겨서 올해는 새로운 주관사를 구해야 했다. 마침 교내근로를 하고 있는 친구가 인천대학교 대학일자리플러스센터(이하 대플센터)에서 정보대 취업률이 낮아 고민 중이라는 얘기를 해주었고, 나는 취업경력개발원에 무작정 전화해서 교내대회 개최를 제안 드렸다. 주관이 바뀌어서 알고리즘 대회에 대한 설명이 필요할 것 같아서, 계획안 초안을 만들어서 미팅할 때 보여 드렸다. 계획안엔 대략 이런 내용이 포함되었다.

  1. 대회 이름, 날짜, 장소
  2. 대회 당일 세부 일정
  3. 참여 대상, 최대 인원
  4. 대회 운영진, 문제 출제진
  5. 예상 비용(+ 상금 규모, 행사 준비 물품 비용, 검수자, 출제자 급료 등 구체적인 비용)
  6. 대회 운영 세부 일정
  7. 대회 개최 목적 및 기대 효과, 문제 구성(난이도, 문제 수, 대략적인 요구 지식) 등등...

이때 학교에서 거점형 취업역량 프로그램을 진행 중이었는데, 마침 11월 한 달간 인천대학교와 지역청년을 대상으로 온라인 알고리즘 강의가 계획되어 있었고, 그것과 교내대회가 연계되면 좋을 것 같다는 긍정적인 답변을 받았다.

대회 날짜는 11/25~12/16 사이의 토요일이 후보에 올랐는데, 11/25은 ICPC일정, 12/9은 기말고사 직전이었다. 12/2은 시험기간이라 참여율이 저조할 것 같아서 12/16(종강 이후)를 원했으나, 교내 프로그램 일정상 12/2을 요청하셔서 그렇게 결정했다. 그런데 지금 생각해보니 이 날짜가 더 괜찮은 것 같다.

이때까지만 해도 순조로운 줄 알았는데... 주관사가 바뀐다는 게 어떤 나비효과를 불러일으킬지 전혀 알지 못했다...


2. 문제 출제, 검수자 모집 - 10/16 ~ 11/3

문제를 만들어보신 분들은 아시겠지만, 원하는 난이도의 문제를 갑자기 뚝딱 만드는 게 쉬운 일이 아니다. 오히려 브론즈 문제를 만들 때 더 어려웠는데, 기초 지식만을 요구하는 문제는 뭘 떠올려도 이미 있는 문제였다. 출제자 3명이 각각 막학기, 3학년, 직장인이어서 시간이 매우 빠듯했는데, 다행히 군대에 있을 때부터 평소에 만들고 싶은 문제가 생각날 때마다 기록해 뒀던 게 있어서 많이 써먹었다. 투표로 실제 출제될 문제를 골랐는데, kimyh9797 3문제, leedongbin 5문제, rdd6584 1문제로 결정됐다. (rdd님 문제도 좋은 게 많았는데, 교내대회에 출제하기는 너무 어려운 문제가 많아서 기각당했다.)

이때쯤 친구들에게 교내대회가 열릴 수도 있다고 얘기했는데, 직전 교내대회에서 난이도 조절에 다소 실패한 것도 있고 기말 시험공부에 부담되는 날짜 때문에 참여를 망설이는 분들이 많았다. 그래서 참여에 의의를 두도록 모든 참가자에게 기념품으로 학교 굿즈를 드리기로 했고, 대플센터에서는 USB를 주는 게 좋을 것 같다는 의견을 주셨는데...

사실 맞는 말이다. 그래서 기념품샵에서 굿즈를 찾아보다가 무선마우스와 USB 가격이 같다는 걸 발견했고,

생각보다 무선마우스가 반응이 좋아서 대플센터에 기념품 변경을 요청했고, 흔쾌히 수락해주셨다.

귀엽다.

검수진 모집은 홍보 게시판을 활용했고, 상당한 실력자분들이 많이 지원해주셔서 고르기가 너무 어려웠다. 오랜 고민 끝에 azberjibiou, leo020630, mjhmjh1104님으로 결정했다. (지원해주신 모든 분들께 진심으로 감사드립니다.) 출제진과 검수진의 소통은 Discord로, 선발된 문제는 Codeforces polygon에서 관리했고, 서강대 교내대회 검수 경험이 정말 많은 도움이 되었다.


3. 대회 개최 요청, 참가자 모집 (+ 검수) - 11/4 ~ 11/24

좀 더 일찍 참가자 모집을 하면 좋지만 규정상 Startlink의 확인을 받아야 홍보 포스터 공개가 가능해서, 홍보하기 전에 먼저 대회 개최 요청을 해서 백준 님과의 연락을 위한 Slack에 초대를 받아야 한다. 요청 양식과 대회 개최 조건 등은 여기에 자세히 나와 있다.

여기서 이번 대회의 첫 번째 고비가 찾아왔다.
앞서 언급했듯이 본 대회는 학교에서 추진 중인 거점형 프로젝트에 연계되는 상황이었고, 만 18세~34세의 지역청년을 포함해야만 했다. 이 조건 때문에 다음과 같은 문제들이 발생했다. 


  1. 지역청년은 규정상 참가 자격이 없을뿐더러, 학교 규정상 졸업 후 2년 경과자는 지역청년에 포함되기 때문에 참가 자격 기준을 정하기 어렵다.
  2. 문제를 재학생이 무난하게 풀 만한 난이도로 선발했기 때문에, 더 어려운 문제를 새로 만들어야 했다.
  3. 지역청년의 대상 범위가 넓어 외부 인원과 재학생의 실력 격차가 크기 때문에, 교내대회의 의미를 잃어버리고 교내 수상자가 아예 없는 상황이 발생할 가능성이 높다. (이게 가장 큰 문제였다.)
  4. 외부 인원의 참여율을 알 수 없어서, 오프라인을 고려하면 추가로 장소를 마련해야 했다.
    ->일단은 기존 50명에서 70(+ 예비 5)명으로 인원을 늘리고, 위층 컴퓨터실을 하나 더 빌리기로 했다.

결국 계획안 결재 과정에서 인천대학교 재학생만 모집 받는 것을 지적받았고, 재학생과 지역청년의 비율이 일정 비율을 만족하지 못하면 예산을 받을 수 없다는 절망적인 답변을 들었다... 이 답변을 들은 게 11/6이었는데, 마음이 꺾여버릴 뻔했지만 이미 검수진 모집까지 마친 상황에서 다른 일정을 포기하고 우리 학교에 지원해주신 검수진분들께 대회를 취소하겠다는 말을 차마 할 수는 없었다. 어떻게든 방법을 찾아보기로 하고, Slack에 초대되자마자 양해를 구해보았다.

정말 다행히도 외부인원 참여를 허락해주셔서 첫 번째 문제점은 해결됐다. 곧바로 홍보 포스터 검사를 받고, 참가자 모집을 시작했다.

외부인원은 홍보 게시판에서 모집하고, 교내에는 오픈채팅방, 에브리타임, 인천대학교 어플 알림 메시지 등을 활용했다. 교내 홍보에 좀 더 신경 썼어야 하는데, 정보대 홍보 게시판에 포스터를 게시하지 못했다. 이후에 한 참가자분이 컴퓨터공학과에 대회가 열린다는 사실조차 모르는 분들이 많았다는 말씀을 해주셨는데, 너무 죄송했다. 모집 당시 재학생과 지역청년 비율이 2:1 정도여서, 홍보를 잘했다고 혼자 착각했던 것 같다. 어플 알림이라도 좀 더 일찍 했으면 좋았을 것 같다.

 

두번째 문제점은 내 실수 때문에 얼떨결에? 해결됐다.
이 문제를 원래 brute force+비둘기집 원리를 사용하는 골드 정도 난이도로 생각하고 출제했는데, 검수 과정에서 내가 생각한 풀이 중 일부가 틀렸다는 걸 발견했다. 감사하게도 azberjibiou 님께서 풀이와 지문을 정말 열심히 다듬어주셨고, 덕분에 예상보다 훨씬 어려운 킬러문제가 되었다. 풀이가 많이 수정되었는데도 비둘기집 원리는 그대로 유지되어서 다행이었다.

문제가 바뀌다 보니 체커(답이 맞는지 채점하는 코드)도 다시 만들어야 했는데, 체커의 요구사항이 이것보다 어려운 상황이었다. 파이썬으로 체커를 작성했다면 쉬웠겠지만, 아직 polygon에 익숙하지 않아 파이썬으로 체커를 만드는 방법을 몰랐다. 다행히도 mjhmjh1104님이 FFT를 잘 다루셔서 체커를 뚝딱 만들어주셨고, 문제 폐기를 막을 수 있었다.

+) 자세한 검수 과정은 이 글에서는 생략하고, 다음 글에서 polygon 사용법을 다룰 예정이다.

 

세번째가 가장 큰 문제점이었고, '외부인의 실력이 어느 정도일까?'에 대해 생각해봤다.
당시 대회 일정이 한양대 ERICA 온라인 대회와 완전히 겹쳤는데, 이 대회를 포기하고 굳이 인천대학교까지 먼 길 오셔서 대회를 치른다...? -> 상금 헌터가 몰려온다! 라는 결론에 다다랐다. 그래서 재학생 수상자가 정말 한 명도 없을 수 있겠다는 생각이 들었고, 진로취업지원관님께 재학생부와 일반부를 따로 나눠 상금을 지급하는 게 어떤지 여쭤보았다. 그런데 이것마저도 결재 과정에서 재학생과 지역청년의 형평성에 어긋난다는 이유로 거절당하고 말았다. (재학생분들 미안합니다ㅠㅠ.)


4. Solved.ac 뱃지/배경 신청 - 11/15 ~ 11/23

이건 대회 운영에 필수는 아니지만, 대회 개최 기념으로 꼭 만들어보고 싶었다. 실제로 Open Contest에 프로필 뱃지와 배경을 얻기 위해 참여하는 분들도 많아서 여러모로 만드는 게 좋았던 것 같다.

배경으로 사용할 학교 전경과 뱃지로 사용할 마스코트 횃불이 사진을 구해야 했는데, 친구가 인천대학교 홍보부서에서 근로하는 분을 알고 있어서 쉽게 구할 수 있었다. 

라는 규정이 있었지만, 그래도 혹시 몰라서 해당 부서에 연락을 드렸고 사용 허가를 받았다.

등록료 5만 원은 견적서와 거래명세서를 받아 카드로 결제했다. 학교 공금을 사용하다 보니 절차가 꽤 복잡했다.

+) 대회 종료 후에 오프라인 참가자분들의 BOJ 핸들을 종합해서 solved.ac 대표님께 완성된 프로필 뱃지/배경 해금 요청을 했고, 무사히 지급됐다.


5. 참가자 명단 종합, 대회 물품 준비 - 11/27 ~ 11/30

이번 대회는 교내 프로그램과 연계되어 StarINU에서 참가자를 모집했지만, 특수한 경우가 아니라면 구글폼 등의 설문조사 플랫폼으로 모집하는 것이 좋다. 운영진이 원하는 자료를 한 번에 수집하기 편하기 때문인데, 대략 이런 정보를 수집해두면 좋다.

  1. 이름
  2. 이메일
  3. 연락처
  4. 대회 중 스코어보드에 보일 닉네임
  5. Solved.ac 뱃지/배경을 받을 BOJ handle
  6. (필요하다면) 학교, 학과, 학번, 학년 등

BOJ Stack에서 대회를 추가하면,

대회 목록에 이렇게 올라오게 된다. (오프라인 대회는 비공개 설정으로 해야 하고, 비공개 대회는 목록에 보이지 않는다. 대회를 마치고 공개로 돌려놓으면 된다.)

여기까지 마친 후 Slack을 통해 백준님께 두 가지 엑셀 파일을 제출해야 한다.

  1. 출제할 문제의 제목과 Stack 문제 번호를 대회 문제 번호 순서대로 적어서 보내드리면, BOJ 문제 번호를 부여해주신다. 이 번호를 BOJ Stack에서 대회 > 대회 목록 > 대회 문제에 등록하면 된다.
  2. 참가자 명단을 보내드리면, 참가자별로 대회 전용 아이디와 비밀번호를 부여해서 회신해주신다. 대회 설정에서 [팀 이름] > [팀 이름 보여줌]을 선택해야 스코어보드에 대회 전용 아이디가 아닌 닉네임으로 보이게 된다. (닉네임을 사용하지 않으면 이름으로 보인다.)

11/27에 참가자분들께 대회 일정과 규칙, 유의사항 등을 메일로 보내드렸다. 학교 PC에 IDE를 설치할 경우 예상치 못한 오류나 라이선스 문제 등이 발생할 수 있어서, 개인 노트북의 사용을 권장해 드렸다.

 

그리고 예정대로 대회 물품을 준비하면서, 구체적으로 필요한 것들을 나열해보았다.

  1. INU 코드페스티벌 2023 플래카드 (대회장 앞 칠판에 붙이는 용도)
  2. 상패 폼보드 (상금 지급 시 사진촬영용)
  3. 명찰 + 대회 전용 아이디, 비밀번호가 적힌 종이
  4. 음료수, 과자 등 다과
  5. 기념품
  6. 만족도 조사 설문지(학교 요청) + 볼펜
  7. 안내데스크용 책상, 의자
  8. ...어라?

..뭔가 뜬금없지만, 여기서 이번 대회의 두 번째 고비가 찾아왔다.
나는 오프라인 대회 운영 자체가 이번이 처음이었고, 심지어 이번 대회는 외부인도 참여하는 대회였다. 좀 더 철저히 시뮬레이션을 돌려봤어야 했는데, 곰곰이 생각해 보니 당장 이런 문제들이 있었다.

  1. 그동안은 '교내' 대회였기 때문에, 학교 구성원은 학교 PC를 사용하든 개인 노트북을 사용하든 학교 와이파이를 사용하면 됐었다. 그런데 외부 참가자분들은 학교 와이파이에 접속할 수 없다는 걸 뒤늦게 알아버렸다.
  2. 대회 운영진은 세 명인데 참여 인원이 늘어 강의실 두 곳을 사용해야 하는 상황이었고, 감독 보조 스태프가 두 명 더 필요한 상황이었다. (게다가 스태프 관련 내용은 계획안에 없던 내용이었다.)

첫 번째 문제를 해결하기 위해 먼저 과 사무실에 가서 말씀을 드렸는데, 학교 공용 와이파이가 있다고 하셨다. 그런데 공유기가 건물 복도에 있어서 강의실 내부에서는 연결이 매우 불안정했다. 개인 핫스팟이라도 제공해 드리려 했으나, Galaxy 기종은 핫스팟 최대 수용 인원이 10명인데다가, 대회 초반에 제출이 몰리면 핫스팟이 감당할 수 있는지도 확신이 없었다. 그래서 어쩔 수 없이 11/30일에 학교 PC 사용이나 개인 핫스팟 지참을 부탁한다는 재공지 메일을 보내드렸다. (외부 인원분들께 미리 보냈어야 할 '학교 오시는 길'도 같이 첨부해 드렸다.)

두번째 문제는 아르바이트 경험이 많은 동기가 보조 스태프를 해주겠다고 해서 빠르게 해결됐고, 스태프 지원금은 출제자 지원금에서 약간 깎아서 지급할 수 있었다. 그런데 여기서 또 다른 문제가 생겼는데, 만약 실제로 1층 강의실이 다 차서 2층 강의실에서도 대회를 치른다면 스코어보드 공개와 시상식을 동시에 진행하기가 힘든 상황이었다. 하지만 보통 신청자가 실제로 참여하는 비율은 50~80% 정도이기 때문에, 시상식 때 1층 강의실 뒤쪽에 의자를 마련해두기로 하고 2층 강의실을 쓰는 일이 없길 기도했다. 다행히 대횟날에 약 60명 정도 오셨고, 2층 강의실은 여섯 명 정도밖에 사용하지 않아서 시상식은 1층에서 다 같이 진행할 수 있었다.


6. 대회 당일 - 12/2

대회 세팅을 위해 11시 반쯤 학교에 도착했다.

학교에 가는 동안 leo020630님이 Webhook 만드는 법을 알려주셨다. 서강대 교내대회 때도 봤던 기능인데, 대회 중에 참가자들이 질문을 보내면 자동으로 Discord에 띄워 주는 기능이다.

강의실에 플래카드를 걸고 안내데스크에 명찰과 다과를 세팅하니 시간이 금방 지나갔다. 1시~1시 40분이 입장 시간이었는데, 생각보다 많은 분이 1시 전부터 기다리고 계셨다.

명찰과 다과를 안내데스크에서 나눠 드렸다.

안내데스크는 스태프에게 맡기고, 나는 참가자분들께 메모용 A4용지를 나눠 드리고 마지막으로 유의사항을 전달해 드렸다. 대부분 메일로 알려 드렸던 내용인데, 이런 내용이다. (질문이 나올만한 내용을 이때 미리 공지하면 좋다.)

  1. 서적 참고, 인터넷 검색 허용. 카카오톡 등 메신저나 ChatGPT등 AI 사용 금지.
  2. 핫스팟 용도를 제외한 휴대폰 사용 불가
  3. 화장실 사용은 스태프와 동승 하에 이동
  4. 질문은 BOJ 사이트 내에서 하기
  5. 대회 1시간 전 스코어보드 프리즈
  6. 본 대회 참가자는 Open Contest에 제출 금지
  7. 문제는 출제자가 예상한 난이도 순으로 정렬됨
  8. 순위 산정 기준 설명

드디어 대회가 시작됐다. 사실 참가자 명단을 받았을 때부터 이미 어느 정도 예상은 했었지만, 대회 시작 17분 만에 5문제를 푸는 분이 계실 줄은 몰랐다.

이때부터 스코어보드가 슬슬 걱정되기 시작했는데, 다행히도 F에 구현문제와 G 이후에 어려운 문제를 배치해서 풀리는 속도가 줄어들었다. 그런데 고수분들에게는 그저 웰-노운에 불과했고, 스코어보드가 프리즈 되기도 전에 All Solve가 나올 것 같아서 프리즈 시점을 30분 앞당겼다.

...그리고 30분 뒤, 절대로 일어났으면 안 되는 이번 대회의 세 번째 고비가 찾아왔다.

마지막 I번 문제의 참가자 제출 기록을 보고 계시던 azberjibiou님이 체커에 문제가 있음을 알려주셨다.
답을 출력하고 마지막에 출력하는 공백은 원래는 무시해야 하는데, 체커가 그것을 오답으로 처리해버린다는 것이다.

뒤늦게 공백을 제거해달라는 공지를 올리고 체커를 수정했지만, 이미 참가자 두 분이 체커 문제로 수차례 페널티를 받아버린 상황이었다. 이 페널티가 1~2위의 순위를 가를 만큼 유의미했기에, 일단 페널티를 점수에 반영하지 않는다고 답변을 드렸다. 하지만 재채점을 하기 전까지는 수정된 체커의 결과가 반영되지 않아 수동으로 페널티를 계산해야 했고, 대회가 종료되기 전에 서둘러 최초 정답 시각을 계산해본 결과 근소한 차이로 스코어보드상의 순위 변동은 없었다. 하지만 스코어보드에 불필요한 페널티를 새기게 되었고, 대회 중에 스트레스를 받게 해드린 것 같아 정말 죄송했다.

아무튼 이렇게 대회가 종료되었고, 시상식 직전에 주어진 쉬는 시간에 스코어보드 공개를 위한 몇 가지 준비를 했다.

프리즈 이후 스코어보드 공개는 왼쪽 [어워드 모드]에서 할 수 있고, 엔터키를 누를 때마다 한 명씩 순위가 공개된다.(프리즈 시점부터 다시 시작할 수 있으니 쉬는 시간에 확인해보면 좋다.)

만약 대상/금상/은상/동상/장려상 등 수상 여부도 함께 공개하고 싶다면, BOJ Stack의 [수상팀]에서 추가할 수 있다.

시상식과 기념품 지급, 뒷정리까지 모두 마치고, 대회에 참가해준 친구들과 술을 마시다가 집에 가서 뻗으면서 대회가 마무리됐다.

맛있었다.ㅎㅎ


7. 풀이 슬라이드 작성 - 12/3 ~ 12/4

지난 대회 풀이가 가독성이 떨어지는 것 같아서 템플릿이 있으면 좋겠다고 생각했는데, 서강대 교내대횟날 놀러 갔을 때 solved.ac 대표님께 여쭤보니 개인 블로그에 정리해두신 솔루션 테마를 사용해도 좋다고 하셔서 곧바로 적용했다. 풀이 슬라이드는 Overleaf에서 공유했고, 이전보다 깔끔한 풀이가 완성됐다.


후기

일단, 우려했던 일이 현실이 되었다. 재학생 중 가장 높은 순위가 전체 17등이었고, 총 15명에게 상을 수여했기 때문에 교내 수상자가 한 명도 나오지 않았다.(Open Contest보다 본 대회가 더 많이 풀린 대회는 처음 봤다.) 그래도 고생해주신 재학생분들과, 먼 길 오셔서 미흡했던 대회 환경에 잘 적응해주신 외부 참가자분들께 감사하다는 말씀을 드리고 싶다.

또한 교내 홍보 부족, 체커 오류, 인터넷 연결 문제 등 조금만 더 꼼꼼했다면 일어나지 않았을 문제들을 너무 많이 일으킨 것 같다. 올해 경험을 바탕으로 다음에 대회를 열게 된다면 실수 없이 준비해야겠다.

혹시 내년을 기대하는 참가자분들이 있으실지 모르겠지만, 내년에는 나도 졸업을 준비해야 하고 다른 출제자분들이 얼마나 바쁘실지 몰라서 개최될지는 미정이다. 만약 개최하더라도 인천대학교 PS를 되살리기 위해 어떻게든 재학생만을 대상으로 할 계획이다.