2020 SKH summaer algorithm camp

온라인 알고리즘 대회 운영 및 후기


2020 숭고한 여름 알고리즘 캠프의 연합회장을 맡게 되어 운영과 출제를 하게 되었습니다. 현재 숭고한 캠프 말고도 UCPC 출제진도 하고 있지만, UCPC까지 출제가 끝난 후에도 알고리즘 대회 출제(또는 운영)를 더 하게 될지는 모르겠습니다.

그럼에도, 미래의 제가 아니더라도 누군가는 제 글을 보고 온라인 PS 대회 운영에 도움이 되었으면 하는 마음에서 후기를 남기고자 합니다.


목차 바로가기

  1. 숭고한 캠프?
  2. 숭고한 비하인드
  3. 업무 분담
  4. 출제를 위한 준비
  5. 폴리곤(Codeforces Polygon)/서버 관리
  6. 교차 검수
  7. 지문 포맷팅
  8. 문제지 제작
  9. Special Thanks to…
  10. 문제 및 풀이 url

숭고한 캠프?


숭고한 캠프는 올해로 3회째를 맞이하는 캠프로, 숭실대학교 SCCC, 고려대학교 Alkor, ALPS, 한양대학교 ALOHA 4개의 알고리즘 동아리가 연합하여 진행하는 알고리즘 캠프입니다.

기존 숭고한 캠프는 4,5일간의 세미나를 진행한 후 배운 내용을 바탕으로 마지막날 대회를 진행했다면 이번 숭고한 캠프는 세미나는 사라지고, 온라인 대회만 진행하였습니다.


숭고한 비하인드


사실 이번 숭고한 캠프는 코로나 19로 인하여 무기한 잠정 연기될 예정이였습니다. 하지만 고려대학교 SW중심 대학의 교수님께서 온라인 대회를 권장해 주셨고, 거기에 제가 강력하게 밀어붙여 온라인 대회를 개최하기로 결정하였습니다. (제 Alkor 회장 임기가 끝나기 전에 출제 경험이 없는 새로운 숭고한 운영진 분들께 출제 경험을 드리고 싶었기 때문에 다소 무리하게 밀어붙인 감도 있었습니다.이 점에 대하여 다시 한번 운영진 여러분 감사드립니다.)

원래 세미나를 통한 실력 향상을 목표로 하는 캠프였기에, 대회만 열게 된다면 기존 취지와는 다르게 고인물(이미 알고리즘을 충분히 잘 하시는 분들)들의 잔치가 되지 않겠냐는 우려가 있었고, 몇 운영진들에게서 초보자를 위한 24시간 대회라는 의견이 나왔습니다.

솔직하게 말씀드리자면, 저는 현실적으로 말도 안 되는 의견이라고 생각했었습니다. 가장 큰 이유는 제가 그러한 대회를 경험해 보지 못했기 때문이지만 그 당시 제가 생각했던 불가능한 이유는 다음과 같았습니다.

  1. 감독은 어떻게 할 거야? 공정한 24시간 대회 운영이 가능할까?
  2. 24시간 대회면 얼마나 많은 문제를 내야 하는거지? 출제자는? 출제비는 구할 수 있어?
  3. 초보자들이 오래 생각해야 풀 수 있는 문제가 뭐지?

격렬한 의논 과정에서, 저희는 꽤 괜찮은 안을 얻을 수 있었습니다. 타 대회와 비슷한 4시간짜리 대회와, 24시간짜리 자유로운 분위기의 마라톤을 함께 여는 것입니다.

  1. 상금(+대회의 공정성)은 4시간 대회(이하 Contest)에 주안점을 두며, 24시간 대회(이하 Marathon)에서는 구글 검색도 허용할 정도로 자유롭게 풀 수 있도록 설계했습니다. 감독은 zoom 화상 회의 프로그램을 녹화하는 형식으로 해결하였습니다.
  2. Marathon의 경우 16문제 정도면 적당하겠다… 라는 계산이 나왔습니다. 한 문제를 평균 한 시간정도 고민할 수 있다면 실력 향상에 큰 도움이 될 것이라 생각했습니다. 그래서 출제비를 구하기 위해 저와 운영진들이 후원 이메일을 많이 보냈습니다 : )
  3. 초보자들이 오래 생각해야 풀 수 있는 문제… 들은 출제진 분들이 굉장히 잘 내주셨습니다. 저는 well-known 고급 알고리즘 문제를 배우는 기회가 되도록 하기 위하여 세그먼트 트리 문제를 출제했지만, 제 문제를 제외하고 모두 재밌고 좋은 문제들을 출제해주셨습니다.

결과론적으로 당시의 제 고민들이 모두 잘 해결되어 다행이면서도 너무 걱정만 했던 제 과거 모습이 조금 부끄럽기도 합니다.

이러한 비하인드를 바탕으로 4시간짜리 Contest(Intermediate/Advanced)와 24시간 Marathon을 열게 되었습니다.


업무 분담


7월 18일에 대회를 하기로 결정되었지만(UCPC, ALPS 내부 대회 등과 겹치지 않으면서 여름방학에 하려고 하니 날짜가 한정되더군요), 대회 형식이 정해진 시점은 6월 초 였습니다.

대회 준비 기간이 두 달이 채 남지 않았다는 점, 운영진들의 기말고사 기간이 겹친다는 점, 그리고 제가 조금은 무리하게 밀어붙였다는 점 때문에 저는 꽤 압박감을 크게 받았었습니다. 대회 준비라는게 정말 많은 업무가 필요한데, 제가 회장이고 다들 바쁘신 만큼 업무를 다 제가 해야만 한다고 생각했었습니다. 이게 꽤 스트레스였던 것 같아요. 2주동안 매일 밤 악몽을 꾸었을 정도였거든요.

때마침 안수빈 선배(@subinium)님께 연락이 와서, 상담을 겸하여 밥을 먹으러 갔습니다. 이때의 식사가 숭고한을 잘 마치는데 정신적으로 엄청나게 큰 도움이 되었는데 나중에 얘기하고… 선배님께 업무 분배에 관한 설명을 들었습니다.

수비니움의 티칭을 기반으로, 각 동아리 사정에 맞게 아래와 같이 업무를 분배하였습니다.

업무를 분배하고 정리하기만 했음에도, 스트레스가 엄청나게 줄었습니다. 특히 서버, 디자인을 제가 신경쓰지 않아도 된다는 점에서 부담감이 절반 정도는 날아갔습니다..

여담이지만, markdown만 쓰다가 수비니움 선배의 추천으로 Notion은 처음 써봤는데 엄청 좋더라구요.ㅎㅎ MAC에서 애플리케이션 로딩이 가끔 지나치게 느린 이슈만 제외하면 최고일 듯 합니다.


출제를 위한 준비


출제를 위해 준비해야 하는 항목은 다음과 깉습니다.

1. 문제 초안 작성 방법 / 예시
2. 문제 가이드라인
3. 일정표
4. 출제 현황표
5. 검수 현황표
6. 해설 작성 방법 / 예시

문제 가이드라인에는 다음과 같은 항목이 필요합니다.

1. 예상 난이도를 수치화 할 수 있는 기준
    난이도 쏠림 현상을 방지하기 위해서는, 예상 난이도를 수치화하여 비교하는 것이 가장 편합니다. 물론 예상 난이도이기 때문에 실제 난이도와 차이가 클 수 밖에 없는 단점은 있습니다. 
    SKH 캠프에서는 solved.ac 에서 제시하는 가이드라인 표준과 codeforces 에서 제공하는 문제 난이도 rating을 기준으로 회의를 통해 난이도를 결정하였습니다.

2. 지문 포맷팅 양식
    길어질 예정이므로, 아래에서 설명하도록 하겠습니다.

출제/ 검수 현황표는 엑셀로 만들어 두었고, 꽤나 잘 기능했다고 생각합니다.

검수의 경우 한 문제당 출제자를 제외하고 2명이 검수하는 걸 목표로 하였으며, 헬 난이도의 문제를 포함하여 대부분의 문제가 2명 이상의 출제진에게 검수를 받았습니다.


폴리곤 및 돔저지 서버


알고리즘 문제 제작을 도와주는 사이트 codeforces polygon 이 있습니다. 테스트 케이스 제작 관련 실수를 잡아주는 것 뿐만 아니라 여러가지 장점이 있어 알고리즘 문제 제작을 하는데 필수적으로 사용해야 합니다.

패키징, 체커 등을 포함한 폴리곤 사용 방법에 관한 이야기를 하기 시작하면 매우 길어지므로, 좋은 블로그를 하나 추천드립니다.

https://evenharder.tistory.com/

이번 대회는 자체 돔저지를 사용했습니다. 돔저지의 장점은 저희 일정에 맞추어 대회 서버를 준비할 수 있다는 점이지만, 단점은 서버 관리가 꽤 귀찮다는 점입니다. 그럼에도 장점이 충분히 커 돔저지를 사용했습니다.

폴리곤에서 돔저지로 문제를 이전하는 과정은 생각보다는 어렵지 않습니다. (하지만 이번 숭고한처럼 문제수가 많으면 엄청난 노동이 됩니다…) 폴리곤에서 패키징한 파일을 내려받으면 테스트 데이터들을 찾을 수 있는데, 이를 돔저지 서버에 올려주어야 합니다. 다만, 폴리곤과 돔저지의 입출력 파일 형식이 다르므로 스크립트를 하나 짜 파일 형식을 일괄 변환시켜주어야 합니다.

폴리곤에서 검수가 완료되었다고 해서 돔저지 서버에서 검수를 하지 않으면 안 됩니다!! 이번 대회에서도 서버 검수를 했다면 일어나지 않았을 몇가지 이슈가 발생했습니다. 최소한 모든 문제에 대하여 2가지 정답 코드(마지막 줄에 개행을 넣거나 넣지 않은)는 서버에서 돌려보아야 할 것 같습니다.

폴리곤과 코드포스에서는 문제 없이 채점이 되는 ‘공백이 포함된 문자열 출력이 필요한’ 문제에서, 돔저지에서는 공백을 아스키 코드 0x20이 아닌 다른 값으로 읽어 들여 틀렸다고 하는 경우가 있었습니다. 또, 체커의 문제로 마지막 줄에 개행을 넣지 않아 맞았음에도 틀리는 개행 이슈도 서버 테스팅을 했다면 일어나지 않았을 문제였습니다.

개행 이슈의 경우 출제진들께 체커 검수를 안일하게 설명했던 제 문제지만, 공백 이슈의 경우 폴리곤과 코드포스에서는 정상적으로 작동하고 체커도 큰 문제가 없기 때문에 서버 테스팅이 아니면 찾을 수 없는 문제입니다.

분명 초기에는 돔저지 테스트 날짜를 잡아두었는데, 할 일은 많고 안일한 마음에 미루고 미루다 보니 일부 문제에 대해서만 서버 테스팅을 했던 실수가 컸습니다.


교차 검수


교차 검수에는 다음과 같은 과정이 필요합니다.

1. 문제가 수학적으로 오류가 없는지
2. checker, validator가 오류가 없는지
3. 맞아야 하는 solution이 잘 통과하는지
4. 틀려야 하는 코드가 통과하지는 않는지

1,2번의 경우는 눈으로 확인해야 하며 3,4번의 경우는 코드를 짜서 확인해야 합니다.

4번에 해당하는 테케를 만드는 과정을 저격한다고 하는데, 시간초과가 날 수 있는 코드를 시간 초과가 나도록 하는 데이터를 추가하고, 틀린 코드가 틀리게 하도록 하는 데이터를 추가하는 과정입니다. 아마 교차 검수에서 가장 활발하게 진행되는 과정이 아닐까 생각됩니다.


지문 포맷팅


지문 포맷팅에는 다음과 같은 항목을 미리 정해두는게 좋습니다.

1. 지문에서 변수, 상수의 글씨체 통일
    대부분의 PS 문제가 그러한데, 변수와 상수는 $mathjax$를 적용하여 기울임체를 적용합니다. 또, 여러번 입력되는 변수는 소문자로, 한 번 입력되는 변수는 대문자로 표현합니다. 

2. 입,출력 형식에 관한 문체 통일(첫 번째, ~개의 줄에 걸쳐 등)
    지문에서 입, 출력 형식을 설명하는 방법은 다양하지만, 대회에서는 통일하는게 참가자 입장에서 편할 것이라 생각합니다. 
    
    예를 들어 (첫째 줄에는/ 첫 번째 줄에는/ 1개의 줄에 걸쳐) 다음 입력이 들어온다. 라는 표현을 (첫 번째 줄에는 다음 입력이 들어온다.) 로 통일하였습니다.
    
    또, (다음 $N$개의 줄에는/ 이하 $N$개의 줄에 걸쳐서) 다음 입력이 들어온다. 라는 표현은 ($N$개의 줄에 걸쳐서) 다음 입력이 들어온다. 라고 통일하였습니다.
    
    2,3번의 경우는 제가 예상하지 못해 가이드라인을 세심하게 세우지 않았고, 그로 인해 지문 검수에 불필요하게 많은 시간이 걸렸습니다. 지문 총 검수를 도와준 후배 이경렬(@Altair_vega) 님과 ALPS @고주연님 감사드립니다.

3. LaTex 및 mathjax 작성 방법

문제지 제작


문제지 제작은 overleaf에서 LaTex으로 진행하였습니다. 굳이 overleaf에서 진행한 이유는 LaTex을 출제진마다 설치하기는 너무 번거롭고, 오버리프(온라인 문서)을 통해 문제지 제작 현황을 출제진들께서 확인하시고, 틀린게 있다면 수정하시는게 좋다고 생각되었기 때문이였습니다.

폴리곤에서 자동 생성하는 pdf를 다운로드 받아 합쳐도 되지만 아름다운 문제지를 만들고 싶기 때문에 굳이 한 번 더 일을 했습니다 :)

하지만 제가 처음부터 틀을 다 짤 자신은 없었기에 2019 KCPC 코드를 많이 참고했습니다. 허락해주신 이상헌(@evenharder)님 감사합니다.

2019 KCPC LaTex 코드는 https://github.com/evenharder/kcpc2019-problemsheet 여기서 확인할 수 있습니다.

참고한 위 코드의 놀라웠던 점은 문제마다 시간/메모리 관리를 전역변수처럼 지정햐여 일괄 수정이 되도록 했다는 점이였습니다. 문제 별 시간, 메모리 제한이 문제지에 2번 이상 나오기 때문에, 일괄 수정이 된다는 점은 코드 수정에 굉장한 장점이였습니다.

* 놀랍게도, polygon과 overleaf에 LaTex/mathjax 가 조금 차이가 있는 듯 합니다. 

* 폴리곤에서는 따옴표를 양쪽 다 ' ' 를 사용해도 무관하지만 overleaf LaTex에서는 열린 따옴표는 `, 닫힌 따옴표는 '를 사용해야 한다는 점을 새로 배웠습니다. 

* 아마 ` ' 을 사용하는 게 LaTex 사용 의도에 맞고, 폴리곤에서는 ' 만 사용하여도 글씨체의 영향으로 무관하게 보이는게 아닐까 추측됩니다.

Special Thanks to…


1달 조금 넘는 빡빡한 일정이였습니다. 매주 최소 1번 이상의 회의를 진행하였는데 한 마디 불평 없이 도와주신 운영진 여러분, 그리고 좋은 문제를 만들어 주시고 교차검수까지 완벽하게 진행해주신 출제진 여러분들 감사합니다.

숭고한 때문에 난생 처음으로 디자인을 한 ALOHA @김휘수님, 대회 전 1주동안 몸 고생과 마음고생이 특히 심했던 SCCC @정종인님, 그리고 운영만을 전문적으로 도와주시고 대회날 라이브 스트리밍까지 한 ALPS 운영진들 모두 감사합니다.

또, 초안 작성, 교차 검수 등 가장 먼저 해 주시고 긍정적인 분위기를 몰고 와 주신 ALOHA @박정호님, 운영진이 아님에도 대회날 오셔서 많은 도움을 주신 ALPS @서태수님, 초안 선별에 큰 힘을 보태주신 ALPS @김민성님, 그리고 부탁하면 발벗고 나서서 도와줬던 Alkor 후배님들 정말 정말 감사했습니다.

안수빈 선배님, “혼자서 모든 걸 다 하려고 하지 마. 일단 업무를 분배하고, 그럼에도 네가 지금처럼 스트레스를 받는다면 엎어라. 출제진들 아무도 원망하지 않는다.” 라고 하신 말씀 정말 기억에 많이 남습니다. 성실하고 뛰어난 분들로만 구성되어 있는 집단이고, 모두 선뜻 저를 도와줄 분들인데도 의지하려고 하지 않았던 제 아집과 스트레스를 선배님의 단 한마디로 날렸습니다. 이 대회 전까지는, 저는 아마 리더십과 희생이라는 단어가 동치라고 착각하고 있었던 모양이에요.

또, 업무(후원 요청) 관련 메일 작성법, 회계 등을 알려주신 것도 감사했습니다. 정말 멋지고 대단한 사람이구나… 라고 생각할 수밖에 없네요 선배님.

P.S 알고리즘 공부를 시작한 지 2년이 되니 슬슬 무언가를 해내고 있다는 생각이 들어 행복합니다. 숭고한이랑은 관계가 없지만, 알고리즘 공부를 시작할 수 있도록, 그리고 계속 공부할 수 있도록 도와준 도재 선배님(@SUDAL)과 정진님(@SoulTch), 과 동기 상헌(@evenharder)에게도 감사 드립니다.


문제 및 풀이 url


캠프가 끝났다고 좋은 문제들이 묻히는 건 아쉽습니다. 그래서!! codeforces에 group을 만들어 언제든지 문제를 다시 풀 수 있도록 문제를 올려두었습니다.

(대회 도중에 있었던 test case 이슈, 지문 이슈, 그리고 지문 이동 중 일부 지문 깨짐 현상 등을 수정하여 올리는 과정이 조금 힘들었습니다. 그러니깐 많이 풀어주세요 ㅎㅎ)