Good Bye, BOJ 2019 출제/운영 후기

2019년 12월 29일 오후 7 ~ 10시, Goob Bye, BOJ 2019라는 대회가 BOJ에서 진행되었습니다.

저는 A번 문제 출제와 검수를 담당했습니다. UniCon에 이어 두 번째로 대회를 운영하면서, 제 시선에서 바라본 운영 후기를 적어보고자 합니다.

대회 문제는 여기에서, 에디토리얼은 여기에서 볼 수 있습니다.
조만간 제 블로그에도 풀이를 올릴 예정이니 기대해주세요! (올렸습니다! 링크)

대회 준비 1 - 운영진 모집

한참 전부터 얘기가 계속 있었고, 수능이 끝난 후에 본격적으로 준비를 했던 것으로 기억합니다.
작년에 leejseonal ddforces (ryuted for div.1)를 진행하셨던 leejseo, rdd6584, ryute, Lawali님께서 대회 준비 초반부터 열심히 준비해주시고, ahgus89, gs11008, junseo, wookje님, 그리고 제가 출제/검수진으로 참가해 문제 제작과 검수를 시작했습니다. 대회 준비 도중 데이터 보강과 난이도 검수 등을 위해 cheetose, ckw1140, ho94949, junie님을 추가로 모셨습니다. 이렇게 해서 13명의 운영진이 모였습니다.

대회 준비 2 - 문제

저는 매우 쉬운 문제 하나 던지고 도망갔습니다. 죄송합니다.
A번 문제에 대한 이야기는 아래에서 몇 가지 TMI와 함께 풀겠습니다.

대회 전에 F와 H를 제외한 모든 문제의 솔루션을 작성해 검수에 기여했습니다.
추가로, wookje님께서 출제하신 E번 문제에서 몇 가지 이상한 풀이로 뚫어보려고 시도했지만 실패했습니다. 데이터 랜덤으로 만들었다는데 생각보다 강해서 놀랐어요.

Lawali님께서 출제하신 H번을 ho94949님께서 avx같은 이상한 방법으로 뚫으려고 시도했지만 실패했습니다. 그 코드에 fastio를 포함해서 몇 가지 최적화를 제가 더 해보았지만 실패했습니다. 근데 대회 중에 상상도 못한 bitset으로 뚫리네요…

ABC번 문제는 개인적으로 Codeforces Div 2 ABC보다 약간 쉬운 느낌이 들고, D는 Div2 D에 맞는 문제라고 생각합니다.
E는 KOI 2014 금광과 비슷한 문제라서 [웰노운 비빔밥]으로 불리기도 했습니다. 금광 문제를 알면 쉽게 생각할 수 있고, 그렇지 않더라도 쉽게 생각해낼 수 있는 문제같습니다.
F는 어떤 문제(스포일러 주의!)와 비슷한 느낌의 기하 문제입니다. 딱히 고민을 안 해봐서 풀이를 몰랐지만, 상당히 직관적인 풀이가 존재합니다.
G는 풀이를 듣고 코딩을 했습니다. 재밌는 문제였습니다.
H는… 문제 이름만 봐도 출제자가 보이는, 풀기 싫은 문제입니다.

대회 준비 3 - 대회 당일

저는 대회 당일에 문제 디스크립션의 맞춤법 교정을 주로 했습니다. 요즘 기술이 발전해서 그런지 맞춤법 검사기가 너무 좋네요.
맞춤법 교정이 끝난 후에는 H번을 avx + fastio + register변수 등등으로 열심히 비볐지만 실패했습니다.

1
2
3
4
5
6
7
#include<immintrin.h>
#include<smmintrin.h>
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("Ofast")
#pragma GCC target("mmx,sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2")
#include <sys/stat.h>
#include <sys/mman.h>

몇몇 운영진분들은 F번을 뚫으려는 시도를 했습니다.

운영진 중 5명(ahgus89, jhnah917, junseo, leejseo, ryute)는 5시 30분쯤 모여서 밥 먹고 카페로 이동해 함께 대회 모니터링을 했습니다.
밥을 먹으면서도 여러가지 이야기가 나왔고, 특히 F번 시간 제한에 대한 이야기가 많이 나왔습니다.
원래는 F의 시간 제한이 3초였지만, Lawali님께서 이상한 방법을 많이 시도하셔서 2.5초, e-1/e초, e/2 + 2/e초, 2초, 1.5초로 점점 줄어들더니 결국 대회 시작 1분 전에 1초로 줄였습니다.
nC2가지 경우에 대해 파라메트릭을 하면 1020ms가 나온다는 제보를 들어서 결국 1초로 줄였습니다.

A번 문제에 대한 몇 가지 TMI

제가 출제한 A번(겨울왕국 티켓예매)에 대해 몇 가지 얘기하자면, 먼저 문제 하단에 적혀있듯이 저는 겨울왕국2를 보지 않았습니다.
이 문제는 학교에서 친구들과 대화하던 도중 L4 자리 경쟁률이 치열하다는 이야기가 나와서 문제를 만들게 되었습니다. codeforces Div 1+2 느낌으로 문제를 구성하자는 의견에 따라 A에 들어가야할 문제가 필요했고, 그 자리에 겨울왕국 티켓예매 문제를 넣게 되었습니다.
데이터는 당연히 모든 경우를 다 집어넣었습니다. 아래 코드는 데이터를 만들 때 사용한 제너레이터입니다. 대회 준비할 때는 무조건 폴리곤을 씁시다!!!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "testlib.h"
#include <bits/stdc++.h>
using namespace std;

int main(int argc, char * argv[]){
    registerGen(argc, argv, 1);
    int t = 18;
    int s = atoi(argv[1]);
    cout << t << "\n";
    for(int i=s*2-1; i<=s*2; i++){
        for(int j=1; j<=9; j++){
            cout << i << " " << j << "\n";
        }
    }
}

대회 모니터링을 하면서 A를 틀린 사람이 꽤 많이 나와서 코드를 구경했는데, -1을 출력하는 조건에 n < 11을 쓴 사람이 많았습니다. 혹은 'L' - 'A'를 쓴다던가…

혹시 문제에 오류가 있거나 질문이 들어올까봐 초반에 긴장했지만, 대회 시작 1분만에 first solve가 나와서 안심했습니다.

마무리

대회는 성공적으로 잘 끝났고, 대회 문제 난이도 분포도 잘 나온 것 같습니다. (solved.ac 기준 브론즈 - 실버 - 실버 - 플레 - 플레 - 다이아 - 다이아 - 루비)
데이터 틀린 것도 없고, H번 bitset 빼면 잘못된 풀이에 뚫린 경우도 없어서 다행인 것 같습니다.

Good Bye, BOJ 2020 얘기도 나오고 있던데, 시간이 된다면 다시 출제에 참가하고싶네요.