제3회 소프트콘 개최 후기
마지막 수정 시각: 2021-12-14 11:24:53
* 이 글은 해당 대회 문제의 풀이에 대한 스포일러를 포함하고 있습니다.
열어야지 열어야지 하고 이런 저런 사정으로 못 열다가 우여곡절 끝에 3회를 열게 됐다. 1, 2회는 전부 2018년에 열고 3회를 3년이 지난 2021년에서야 열게 될 줄은 몰랐는데... 그래도 이제는 좀 여유가 생겼으니 매년 대회를 열어야지 생각중이다.
3회 소프트콘 문제는 링크에서 풀어 볼 수 있다.
준비
사실 2020년초쯤에 3회 소프트콘을 열 생각이었고 출제할 문제 목록도 어느 정도 확보를 한 상태였으나, 그 시기에 개인적으로 너무 힘이 들어서 대회를 개최할 여력이 없어 결국 열지 못 하고 파토가 났었다.
올해는 작년에 비해 여러가지로 여유가 많이 생겼고 여기서 더 미뤘다간 영영 대회를 개최하지 못 할 것 같아 꼭 대회를 열겠다고 생각하고 4월 초쯤부터 틈틈히 문제를 고민하기 시작했다.
개인적으로는 OI류 대회의 진행 방식(서브태스크 문제, 문제별 배점이 같음, 제출 패널티 없음 등)이 제일 재밌다고 느꼈기 때문에 3회 대회는 이러한 형식을 차용했다. 그래서 어쩌다보니 1회, 2회, 3회의 형식이 전부 다른 통일성 없는 대회가 되어버렸는데 아마 4회 이후부터는 3회와 같은 형식을 쭉 유지할 것 같다.
아무튼 그렇게 8문제 / 문제당 125점 만점 / 총점 1000점 이라는 기준을 세우고 계속 문제를 고민했는데 7월즈음까지 문제를 4개 정도밖에 준비하지 못해 발등에 불이 떨어졌다. 이런 식으로는 올해 안에 대회를 열지 못할 것 같아서 exqt님으로부터 2개의 문제를 받아왔다. 덕분에 적절한 시기에 문제 준비를 끝마칠 수 있었다.
7월 말쯤 exqt님에게 받아온 2개의 문제를 포함해 모든 문제의 초안을 만들었고, cheetose님, kyo20111님, cs71107님이 문제의 검수를 맡아주셨다. 세 분 모두 문제를 꼼꼼하게 봐주셔서 대회를 굉장히 성공적으로 진행할 수 있었다.
개인적으로는 3회 대회는 문제 구성과 진행 과정이 모두 아주 만족스러웠다. 대회를 개최하면서 점점 내가 원하는 방향을 잘 찾아가고 있는 것 같은 기분이다.
문제별 출제 과정
나는 해법을 정해놓고 문제를 만들면 항상 뻔한 문제가 나와서, 대회에서 사용할 문제를 고민할 때에는 해법을 모른 채로 문제를 만든 후 그걸 해결하는 방식으로 접근한다.
이 방법은 재밌는 문제를 만들 확률이 높지만 문제를 만드는데 시간이 오래 걸리고, 문제의 난이도를 내가 원하는 수준으로 조절하기가 어렵다는 단점이 있다. 이번 대회의 문제들은 어떤 과정을 거쳐 아이디어를 얻어서 만들었는지 정리해두면 좋을 것 같아 간단히 내가 출제한 문제들의 출제 계기를 정리해보았다.
A. 점프 숨바꼭질
BOJ에는 많은 숨바꼭질 시리즈 문제가 있다. +1, -1로 이동하는 대신 이동할 때 두 배로 뛰면 어떨까 싶어서 만들었다.
B. 2D 큐브
원래는 처음 큐브의 상태와 상하 좌우 이동 연산을 수행한 목록이 주어졌을 때 최종 결과를 출력하는 형태의 문제를 고민했는데, 빠르게 해결하는 방법이 잘 안 떠올라서 반대로 바꿨다. 바꿔보니 적당히 쉽고 재밌는 문제가 된 것 같아서 그대로 출제했다.
C. 도시 계획
예전에 이 문제와 동일한 방식으로 빌딩들이 주어지고 쿼리로 p, q가 주어지면 p번째 빌딩의 옥상에서 q번째 빌딩의 옥상을 볼 수 있는지 판별하는 문제를 생각했던 적이 있었다. 문제 아이디어가 잘 안 떠올라서 폴리곤을 뒤지다가 그걸 발견하고 문제를 조금 바꿔서 지금의 문제를 만들었다. 조금 전형적인 문제라서 아쉽긴 하다.
D. 계산 최적화
원래는 배열이 아니라 트리의 각 정점에 연산들이 적혀 있고, 자식 노드에 방문하는 순서를 임의로 고를 수 있을 때 전체 연산값을 최적화하는 방문 순서를 찾아라 같은 형태의 문제였다. 근데 너무 어렵고 복잡해서 문제를 바꾸다가 지금처럼 바뀌었다. 이 문제도 상당히 전형적이긴 한데 그래도 교육적으로 낼만한 문제 같아서 그냥 냈다.
F. 압축 프로그램
예전에 학교 다닐 때 들었던 게임 서버 수업에서 ObjectPool의 구현을 배웠을 때 방식이 굉장히 신기하다고 생각했었다. 포인터의 값을 한 번에 두 가지 용도로 사용하는 부분에서 그런 느낌을 받았는데 문제에서 이런걸 응용할 수 없을까를 생각하다 이 문제를 만들게 됐다. 개인적으로는 아주 마음에 드는 문제.