알고리즘/오프라인 대회

47th ICPC World Finals (WF 2023) 후기: 1/2

kdh9949 2024. 4. 21. 04:56

2024년 4월 18일에 Luxor, Egypt에서 개최된 46th ICPC World Finals (WF 2023) 에서 7등을 기록하여 은메달을 획득하였다. 솔직히 서울대 입학할 때만 해도 월파를 한 번이라도 나가 보면 다행이라고 생각하고 있었는데, 어떻게 하다 보니 2번이나 나가서 메달도 2개를 따게 되었다. 기본적으로 이런 대회 성적은 실력도 실력이지만 운/당일 컨디션 등의 변수에 크게 의존한다고 생각하는데, 두 번의 WF 모두 그 시점의 실력으로 낼 수 있는 거의 최대에 가까운 성과를 낸 것 같아서 좋다.

대회 가서 있었던 일만 딱 쓰기보다는 서사를 전체적으로 써 두면 나중에 보고 추억 되새기기에 좋을 것 같아서 이번 글은 좀 길게 남겨 보려고 한다. 1편에는 월파 가기 전까지의 일을 정리해 보았고, 월파 가서 있었던 일만 궁금하다면 바로 2편을 읽으면 된다.

 

팀 결성

2021년 1월에 입대를 하고, 훈련소를 어떻게 보낸 후 자대에 넘어갔다. 내가 간 부대는 수상하게 서울대 공대/자연대 학생들이 많은 좀 특이한 부대였는데,  그래서 이론상 ICPC 팀을 만들 수도 있었다. 우선 일차적인 목표는 군대에서 UCPC를 참가하는 것이었는데, 사실 UCPC만 치려면 밖에 있는 친구/지인들이랑 팀 대충 짜서 나갈 수도 있었지만, 뭔가 "군대에서 모은 팀으로 ICPC WF 나가기" 라는 서사를 상상해 봤더니 되게 재밌을 것 같아서 한 번 시도나 해 보기로 했다.

당시 선임들 중 나 빼고 백준을 가장 열심히 풀던 두 명 (하린, 정현) 을 영입(?)하였고, 공교롭게도 셋 모두 서울대학교 18학번이었기 때문에 2022년도에는 ICPC에도 출전할 수 있는 팀이 되었다. 그 때 ICPC 나가자고 얘기를 했는지 어쨌는지는 잘 기억이 안 난다..

군대에 있을 때 이 팀으로 친 대회는 그 해 8월에 열린 UCPC 2021 하나였다. 당시 코로나가 한창 유행이었기 때문에 예선/본선 모두 온라인으로 치루어졌고, 우리 팀은 둘 다 싸지방에서 참가했다. 팀명은 뭘 할까 하다가 팀원 중 최고 선임이 출연한 조회수 656만 짜리 영상 링크를 그대로 쓰기로 했다. 후기는 왠지 모르겠는데 안 썼다;; 좀 쓸걸.. 아무튼 싸지방에서 별 생각 없이 친 예선에서 1등을 해 버려서 약간 기대를 했으나, 본선은 너무 어려워서 그냥 적당히 쉬운 거 빨리 풀고 6등으로 마무리했다. 사실 이 땐 3컴 대회였고, 이 때만 해도 나랑 다른 팀원 간에 실력 격차가 좀 있었기 때문에 반쯤 개인대회 치는 느낌으로 했던 것 같다. 이 때 상품으로 에어팟 받은 건 지금까지 잘 쓰고 있다.

군 복무 시절에 개인적으로 PS 연습을 좀 하긴 했지만, 이 때까지만 해도 이 팀으로 ICPC WF를 나가야겠다 내지는 나갈 수 있다 같은 생각을 아예 안 하고 있었어서 그냥 시간을 열심히 때우는 데 좀 더 집중을 했던 것 같다.

다음 해에 열린 UCPC 2022는 셋 모두 전역한 채로 출전했고, 이 때 후기는 예선 만 썼었다;; 아무튼 본선은 결론만 말하면 내가 말려서 성적이 그다지 좋지 못했다. 사실 이 즈음에는 그냥 전역하고 집에서 노느라 별로 열심히 준비를 안 한 상태였을 텐데, 그래도 이렇게 한 번 대회에서 머리 깨지고 나니까 그 해 가을에 있을 Seoul Regional은 좀 더 각 잡고 준비를 해야겠다는 생각을 했다.

 

2022 Seoul Regional / 우리 월파 나가요?

UCPC 2022의 경험을 바탕으로 Regional을 준비하면서는 개인 연습에 좀 더 집중하였다. 팀명은 HappyLastDance 라고 하린이가 지었다. 너무 무난한 느낌이 있지만, 내가 좀 더 재밌는 팀명을 찾지 못 한 시점에서 최선의 노력이었다고 생각한다. 예선 / 본선 후기에 좀 더 자세한 준비 과정 및 소감을 적어 두었다. 

어쨌든 결과를 요약하면, 전체 3등 / 서울대 2등을 기록하였다. 이 때는 아직 Asia Pacific Championship이 도입되기 전이라 원래같았으면 그냥 서울대 1등 팀이 월파 진출하고, 우리 팀은 "졌지만 잘 싸웠다" 하고 끝나는 이야기였을 것이다. 하지만 코로나의 여파는 아직도 남아 있었고, 이 당시 서울대 1등 팀은 너무 잘 하는 팀이었기 때문에 2020 / 2021 Seoul Regional에서 이미 2번이나 우승했던 전적이 있는 팀이다. 서울대 20학번 3명으로 이루어진 팀인데, 팀명이 맨날 바뀌어서 그냥 "1등 팀" 이라고 부르겠다.

여기서 뭔가 이상함을 느껴야 하는데, 왜냐하면 정상적인 방법으로는 Regional 우승을 3번 할 수 없기 때문이다. 우승을 하면 월파를 나가고, 월파를 2번 출전하면 그 다음부터는 아예 Regional 대회부터 나갈 수 없어진다. 그런데 1등 팀은 어떻게 우승을 3번이나 했냐 하면, 2021 Regional에 해당하는 월드 파이널 대회가 코로나 때문에 연기되어 2022 Seoul Regional 본선날까지도 열리지 않았기 때문이었다. 상황이 이런 고로, WF 주최측에서는 이 즈음에 "2021/2022 Regional에 해당하는 WF (즉, 2022/2023 WF) 는 2023년에 동시 개최한다" 라는 특단의 수를 둔다.

이 경우 두 대회에 동시에 진출한 팀(내지는 팀원)이 생길 경우 문제가 되는데, 서울대의 경우는 아예 팀이 동일한 경우였다. 이 때는 그 팀이 먼저 22/23 WF 중 어느 쪽으로 나갈지 정하고 -> 반대쪽 대회에 나갈 팀을 학교에서 정해서 통보하는 (보통의 경우는 그 해 그 대학교 2등 팀이 될 것이다) 식으로 정하게 되었는데, 그래서 2021 Seoul Regional 서울대 2등 팀인 "The Elders" 팀과 우리 팀 중 어느 팀이 나가는지 정해야 하는 상황이 되었다.

이 과정이 참 험난했는데, 우선 WF 측에서 공지를 드럽게 늦게 해서 의사 결정 과정이 상당히 delay되었다. 그 외에도 여러 사정들이 복잡하게 겹쳐서 이 글에 정확히 다 밝히기 어려울 정도로 일이 꼬였다. 어쨌든 결과만 요약하면 아래와 같다. (내 기억이 정확하지 않아 정확한 날짜 및 순서는 틀렸을 수 있다)

 

(2023) 9월 : 1등 팀이 23 WF를 나가기로 정함. 따라서 The Elders 팀이 22 WF를 나가기로 함.

10월 초 : WF 측과 커뮤니케이션 중 혼선이 생겼어서, 1등 팀이 22 WF를 나가고 우리 팀이 23 WF를 나가는 걸로 진작에 확정이 되었다고 함. 바꿀 수 있냐고 물어봤는데 못 바꾼다고 함.

10월 7일 : 이스라엘-하마스 전쟁 시작. 원래 WF가 열리기로 했던 Sharm El-Sheikh는 이스라엘과 상당히 가깝다.

10월 중순~말 : 전쟁으로 인한 WF 연기 선언.

(2024) 1월 : 위치를 Luxor (이스라엘에서 좀 더 먼 도시) 로 바꾸고, 4월에 연다고 함.

4월 14-19일: WF 열림.

 

The Elders 팀을 보내기로 처음 결정이 되었을 때는 솔직히 좀 아쉬웠지만, 그렇다고 우리가 나가야 한다는 정당한 이유도 따로 없었기 때문에 그냥 그런가보다 하고 가만히 있었다. 그런데 갑자기 대회 한 달 남겨 놓고 갑자기 우리가 나가야 된다고 하니 좋은 일이긴 하지만 당황스러움이 좀 더 컸던 것 같다. 그래서 부랴부랴 비행기표도 끊고 준비 열심히 하고 있었는데 갑자기 연기가 되니 그 당시에는 좀 화가 났었다. 근데 이제 와서 보니 11월에 바로 대회 나갔으면 메달 못 땄을 거 같다.. 그냥 인생사 새옹지마인 것으로 생각하기로 하자.

 

UCPC 2023 / 팀 연습

UCPC 2023 후기 (예선 / 본선) 역시 참고하면 좋다. 이 때만 해도 그냥 재미로 나간다는 생각이었는데, 지금 생각해 보니 WF 메달을 따는 데 큰 도움이 된 팀 연습으로 볼 수도 있을 것 같아 여기 첨부한다.

대회가 4월로 확정이 되면서 팀 연습 할 시간이 좀 생겼는데, 나머지 두 팀원이 대충 1~2월까지는 유학 준비 때문에 바빴기 때문에 그 이후로 날짜를 좀 잡아서 연습을 진행했다.

우선 2월에 열린 프로그래밍 캠프인 OCPC에 (부분적으로) 참가를 했었다. 문제 스타일 자체는 솔직히 말하면 "별로 WF에 안 나올 거 같이 생긴" 문제들이 더러 보였긴 한데, 원래 캠프 문제가 WF 문제랑 좀 다르게 생기긴 했다. 그것보다는, "어려운 문제가 많은 셋"을 도는 연습을 했다는 쪽에서 더 의미가 큰 시간이었다. 그리고 대회 2주 전부터 총 5번 시간을 잡아서 팀 연습을 했다. 이 땐 그냥 쉬운 셋 / 어려운 셋 둘 다 적당히 골라서 돌았던 것 같다.

팀연습 결과 자체를 요약하는 건 별로 의미가 없을 것 같고, 팀연습 과정에서 유의미하게 배운 점이 좀 있는 듯 하다.

ICPC 문제 셋을 "쉬운 셋"과 "어려운 셋"으로 대충 분류할 수 있다. 쉬운 셋을 나타내는 기준은 "쉬운 문제(=보자마자 풀 수 있는 문제)가 얼마나 있는가?" 이다. 대충 3개 이상이면 쉬운 셋이라고 하자. Seoul Regional의 경우, 인터넷 예선은 무조건 쉽고, 본선은 낮은 확률로 쉬운 셋인 듯 하다. (2022는 쉬웠다) 2023 UCPC는 어려운 셋이었다. ICPC WF는 무조건 어려운 셋이다. 우리 팀은 쉬운 셋과 어려운 셋에서의 최적 전략이 다르다. 쉬운 셋을 풀 때 쓸 수 있는 전략을 어려운 셋에서는 못 쓴다고 말하는 게 좀 더 정확할 듯 하다.

쉬운 셋의 경우, 초반 문제를 내가 거의 읽자마자 풀 수 있기 때문에 내가 컴퓨터 앞에서 3~4문제 정도를 바로 연달아 푸는 게 유효한 전략이고, 그 동안 하린이가 중간 난이도 문제 (보자마자 풀 수 없는 문제) 를 하나 풀어서 교대 타이밍을 맞추면 매우 효율적이다. 그 이후는 어려운 문제를 둘 또는 셋이서 같이 고민하고 구현할 시간이 주어지게 된다. 이 경우, 하린이가 키보드를 잡기 시작하는 순간부터 내가 중간~어려운 난이도 문제를 고민할 시간이 많이 생기게 된다. 이런 식으로 대회가 잘 흘러갈 경우 무난하게 좋은 성과를 낼 수 있다.

쉬운 문제가 없다면, 일단 그나마 빨리 풀 수 있는 문제를 찾아서 풀이를 내고 코딩을 최대한 빨리 시작해야 한다. 그 이후는 일반적인 팀처럼 한 명 코딩하면 나머지 두 명이서 풀이 내는 식으로 돌아가면서 문제를 풀게 되는데, 여기서 약간 달라지는 점은 정현이가 낸 풀이는 보통 내가 짠다는 것이다. 하린이가 낸 풀이도 가끔씩은 내가 짠다. 이 과정에서 깨달은 게 있는데, 구현이 많이 필요한 셋일수록 나는 나머지 두 명이 풀이 던져주는 거 짜기만 하다가 끝난다. UCPC 2023이 그랬고, 놀랍게도 WF 때도 그랬다.

이런 식의 전략 역시 잘만 풀린다면 성과는 잘 나오겠지만, 조건이 좀 더 필요하다. 구체적으로는, 셋에 나온 문제들의 스타일이 좀 중요하다. 나랑 나머지 두 팀원 간에 "풀이를 잘 내는 문제"의 스타일이 좀 다른데, 셋에 내가 잘 푸는 문제들(트리/그래프/자료구조/...)만 잔뜩 있으면 내가 풀이도 내고 코딩도 해야 하니 자연스레 불리해지고, 반대로 나보다 하린/정현이 더 잘 푸는 문제(아이디어/수학/기하/...)들이 잔뜩 있으면 나는 그냥 5시간 내내 코딩만 해도 되니까 내 마음도 편하고 성과도 잘 나온다.

요약하자면, 쉬운 셋의 경우 내가 풀이/코딩 모두 많은 부분을 담당하게 되는데, 어려운 셋일수록 내가 코딩에 더 치중하게 되면서 팀원의 역할 배분이 전체적으로 균등해지는 느낌이었다. 팀연습 결과는 한 번 완전 망한 걸 빼면 "나쁘지 않다" 언저리에서 계속 맴돌았는데, 나 포함 셋 모두의 실력 자체는 충분하다고 믿었기 때문에 그냥 "잘 하면 메달 딸 수 있을 것 같다" 정도의 생각을 가지고 비행기 타러 갔던 것 같다.

 

이제 진짜 WF 대회 후기는 2편에서..