[SMUPC 대회] 제1회 숙명여자대학교 교내 알고리즘 경진대회 출제 후기
[알고리즘 경진대회를 열게 된 계기]
알고리즘 공부를 제대로 시작한 것이 대학교 2학년 때였던 만큼 알고리즘 공부를 왜 좀 더 일찍 시작하지 않았었을까라는 아쉬움이 남아있었다. 때문에 우리 학교에 다른 학우분들이 좀 더 알고리즘에 친숙함을 느끼고 관심을 갖게 되었으면 하는 마음에 알고리즘 경진 대회를 개최하고자 마음먹게 되었다.
알고리즘 경진 대회 개최에 관해 처음 말이 나왔던 것은 "학교 혁신단 활동"이었다. 학교 혁신단은 학교에 어떤 비교과/교과 활동이 있었으면 좋겠는지에 대한 아이디어를 구체화하여 제안 및 발표를 하는 활동이다. 그 당시에 "알고리즘 경진 대회 개최"와 "SW캠프 진행"이라는 2가지 아이디어 중 1가지만 제안하는 것이 좋을 것 같다는 조언을 받아 "알고리즘 경진 대회 개최"는 제안하지 못했었지만 이번에 알고리즘 경진 대회를 열고자 하는 뜻이 있는 사람들이 모이게 되어 대회를 개최할 수 있었다.
[출제한 문제 ]
- SMUPC의 등장
A번으로는 단순 출력 문제를 내는 것이 좋을 것 같다는 생각으로 만들게 된 문제이다. 가장 기본적인 것을 기반으로 문제를 내고자 했기 때문에 문제의 소재로 아스키코드를 택하여 문제를 내게 되었다.
- SMUPC 계산기
이 문제는 그 당시 프로그래밍 언어 과목의 과제였던 재귀 하강 파서 실습 과제를 하다가 만들게 된 문제이다. 문자열 파싱을 유도한 문제이며 복잡한 조건에 맞게 구현해 낼 수 있는지를 확인하고자 출제한 문제이다.
조건 서술에 있어서 공을 많이 들였던 문제이다. 문제가 다른 방향으로 해석될 여지가 없어야 했기 때문에 다른 검수진 분들께 계속 피드백 받으며 지문을 계속 수정했었다. 당시에는 지문 작성이 힘들었지만 또 다른 출제자인 swoon님과 다른 검수진 분들께서 많은 도움을 주셔서 처음 지문에 비해 훨씬 깔끔한 지문이 될 수 있었다.
- 얼음깨기 펭귄
이 문제는 저번 ICPC Sinchon 뒷풀이 당시 보드게임 카페에 가서 했던 게임을 문제로 만들어보면 어떨까라는 생각에서부터 나오게 된 문제이다. 처음에는 그래프로 문제를 만들려고 했다가 예외 사항이 너무 많아져 문제의 난이도가 매우 높아질 수 있겠다는 이야기가 나오게 되어(다이아까지 갈 수도 있을 것 같다는 의견이 있었다...) 트리라는 조건을 추가해 문제의 난이도를 낮췄던 문제이다.
[문제 출제의 과정]
문제는 BOJ Stack에서 세팅을 하며 문제 출제는 문제 아이디어 생각해 내기, 아이디어를 기반으로 문제 지문 작성하기, 문제에 대한 해답 코드 작성하기, 문제의 정답 여부를 판별할 테스트 케이스 만들기, 테스트 케이스 검증 코드 작성하기, 검수 피드백하기, 문제 풀이 슬라이드 만들기의 과정으로 이루어진다.
1. 문제 아이디어 생각해 내기
대회 참가자들의 특성을 고려하여 문제에 대한 아이디어를 생각해 내야 한다. 참가자들이 대체적으로 어느 정도의 수준인지, 어떤 알고리즘 분류를 내는 것이 좋을지에 대해 생각해야 한다. 이를 위해 다른 출제자이신 swoon님과 회의를 하며 어떤 알고리즘 분류를 낼지 또 누가 어떤 알고리즘을 주제로 문제를 낼 것인지, 난이도는 어느정도를 낼지 먼저 정하고 문제 아이디어를 내기 시작했다.
2. 아이디어를 기반으로 문제 지문 작성하기
아이디어를 기반으로 실제 대회에 사용할 문제의 지문을 작성하며 아이디어를 구체화한다. 그리고 회의를 통해 어떤 문제를 대회의 문제로 선정하면 좋을지에 대해 해당 지문을 가지고 논의하게 된다.
3. 문제에 대한 해답 코드 작성하기
만든 문제에 대한 해답 코드를 작성한다. 해답 코드가 지문의 조건에 맞게 작성되었는지, 지문에 또 다른 예외 조건이 있을 수 있는지 유의하며 해답 코드를 작성해야 한다.
4. 문제의 정답 여부를 판별할 테스트 케이스 만들기
문제 출제에 있어서 가장 중요한 부분이라고 이야기할 수 있을 것이다. 시간 초과 및 코드의 WA여부를 테스트 케이스를 바탕으로 판별해야 하기 때문에 테스트 케이스를 잘 선정해 내는 것이 중요하다.
5. 테스트 케이스 검증 코드 작성하기
만들어 놓은 테스트케이스가 문제의 조건에 맞게 들어가 있는지 확인하기 위한 코드를 작성한다. 이 과정에서 testlib를 사용하여 validator를 작성하게 된다. (이곳의 내용을 바탕으로 코드를 작성했다.)
6. 검수 피드백하기
BOJ Stack에 세팅을 완료하게 될 경우, 검수진 분들께서 지문 및 부족한 테스트 케이스들에 관하여 피드백을 진행해 주신다. (여담으로 각 문제들을 검수 받을 때마다 느끼지만 검수진 분들은 정말 대단하신 것 같다...)
7. 문제 풀이 슬라이드 만들기
마지막으로 출제한 문제들에 대한 풀이를 작성하여 배포하게 된다.
[출제 후기]
아직 출제의 경험이 많지 않아 알고리즘 분류를 다양하게 내지 못한 감이 없지 않아 있었다. 다양한 문제를 풀어보고 보다 더 다방면에서 생각해 보며 다음번에 또 출제의 기회가 온다면 다른 알고리즘 분류의 문제를 내보고 싶다.
대회 개최 전날까지도 대회 문제의 난이도가 괜찮을지에 대한 확신이 없어 많이 불안했었다. 올솔이 나올 지에 대해서 걱정하기도 또 문제가 많이 안풀릴 수도 있지 않을까에 대해서 걱정하기도 했다.
5월 8일 대회 당일날 153분의 학우분들께서 대회를 신청해 주시고 참여해 주셔서 감회가 새로웠다. 출제를 할 당시에는 힘들었지만 다른 사람들이 내 문제를 풀어주는 것을 볼 때면 느낄 수 있는 뿌듯함이 문제 출제의 매력인 것 같다.
[ 힘들었던 점 ]
제1회 숙명여자대학교 교내 알고리즘 경진대회를 개최하며 가장 힘들었던 점은 아무래도 "처음 여는 교내 알고리즘 대회"라는 것에서 오는 중압감이었다. 교내에 알고리즘 경진 대회가 개최되었던 적이 없었기 때문에 문제 난이도 설정, 내부 검수진 구하기, 출제진 구하기 등 대회 개최를 위해 준비해야 하는 요소들 하나하나가 전부 난제였기 때문이다. 대체적으로 알고리즘에 대한 관심도가 낮았던 터라 교내에서 백준 출제진 및 검수진 조건을 만족하는 사람을 찾기가 쉽지 않았다. 그래도 검수진 중 우리 학교 학생이 한명 이상은 있으면 좋을 것 같다는 이야기가 나와 운영진 중 한분인 songfox00님이 내부 검수진 조건을 채워주셔서 다행이었던 것 같다. 다음번에 또 교내 알고리즘 경진대회가 개최될 수 있다면 그 때는 제1회인 지금보다 더 많은 교내 학우 분들이 출제진 및 검수진으로 참여해 주셨으면 하는 마음이다.
앞 이야기의 연장선이긴 하지만 운영진중 대회 출제 및 진행 경험이 있었던 사람이 나 밖에 없어서 좀 더 힘들었던 감이 있었다... 왜냐하면 진행 경험이 있는 나조차도 출제 및 대회를 진행한 횟수가 1번 뿐이었기 때문이다.. 출제 일정 관리부터 시작해 대회 진행 방향 설정, 문제 완성도 확인, 회의 주관 등의 일을 주최자로 진행하려 하다보니 그 압박감과 책임감이 막중했다. 더불어 하필 대회 준비기간과 시험 기간이 겹치게 되어 시험 기간에도 대회 개최 준비를 해야 했으니 이에 대한 스트레스는 상당했다고 할 수 있을 것이다. (대회 개최날로부터 이틀 뒤가 전공교직 시험이었다...)
그래도 결과적으로는 대회를 무사히 마칠 수 있어서 참 다행이었다. 아마 출제진 및 검수진 분들께서 도와주시지 않았다면 이렇게 성황리에 대회를 개최할 수는 없었을 것이다. 문제 피드백에서부터 시작해 대회 개최와 관련하여 많은 도움을 주신 연세대학교의 lky7674님과 좋은 문제를 내주시고 회의를 같이 이끌어 주셨던 swoon님, 문제에 대해 다방면으로 피드백해 주었던 sait2000님, wbcho0504님, cs71107님, plast님, songfox00님께 감사의 말씀을 전하고 싶다.