여행을 목적에 두지 않고 먼 길을 떠나는 일이 참 오랜만이다.

터미널로 향하는 지하철 플랫폼에서 만난 한 편의 시.
서울로 가는 한 갈래의 길은 바로
https://ucpc.me/

UCPC 2022

2022년 여름 대회 전국 대학생 프로그래밍 대회 동아리 연합 주요 공지 (7/2) UCPC 예선이 종료되었습니다. 본선 진출자를 메인 페이지에서 확인하실 수 있습니다. (7/1) UCPC 예비소집이 시작되었습니

ucpc.me


대회장

대회장 입구에 도착하니 사람들이 많이 모여 있었다. 개중에는 서로 아는 사이인지, 같은 학교인지, 같은 동아리인지 이야기를 주고 받는 사람들도 많았다. 대회장에 들어가고 나서는 거의 사람 구경을 했던 것 같다. 대회를 운영하는 스태프 분들 중 눈에 익은 핸들러를 가진 분들이 많았다. 어떤 알고리즘을 정리한 블로그 포스트에서, 어떤 문제의 질문 답변 게시판에서 본 적이 있는 핸들러들. 그분들을 직접 보니 드디어 그간의 감사함과 리스펙이 몇 바이트 문자열이 아닌 사람을 향할 수 있어서 좋았다.


사람의 첫인상을 아쉽게 만들어 준다는 노란색이라는 점만 빼면, 티셔츠 디자인이 마음에 들었다. 침착함을 유지하는 데 효과가 있는 초록색이나 파란색 계열이었으면 어땠을까 하는 아쉬움이 있다. 오프라인 대회에 참가해 본 경험이 거의 없는 사람으로서, 명패의 퀄리티에 놀랄 수밖에 없었다. 상당히 고퀄이다. 솔브닥 별 조각 바우처도 디자인이 간결해서 좋았다. 금액은 2000~4000 랜덤인 듯한데, 우리 팀은 다 4000이 걸리고 나만 3000이 걸렸다. 액수에는 별 감흥이 없었다. "개발 시러!"라고 말하는 한별이 이모티콘 스티커... 지금은 그 메시지에 공감이 많이 되는데, 조금씩 공감이 덜 되어가길 바랄 뿐이다. DEVOCEAN이라는 기술 블로그 사이트를 새로 알게 되었는데, 유용한 정보가 많이 업데이트 되는 듯해서 북마크에 추가했다.


문제 풀이

5시간 동안 13문제가 주어졌다.

나는 일단 I번부터 봤는데 단순 세그먼트 트리처럼 보였고, 아직 문제를 잡은 팀원이 없어서 바로 코드를 짜기 시작했다. 하지만 구현했더니 테케 정답도 나오지 않는 오류가 있었고, 팀원 B에게 자리를 비켜줬다. 팀원 A와 얘기해 보니, 내가 문제를 아예 잘못 이해하고 있었다. 아직 퍼솔(퍼스트 솔브)이 나오지 않은 문제라서, 이 기회를 놓치지 말아야 한다는 조급함이 있었는데, 역시 퍼솔이 나오지 않는 데에는 이유가 있었다. 상당히 어려운 문제였다.

팀원 B가 J번을 맡아 풀어서 AC를 받고, 팀원 A가 H번을 맡아 풀어서 AC를 받았다. 나는 그들이 공유하는 로직에 고개를 끄덕하는 역할을 했다. 그리고 L번을 팀원 모두가 같이 보게 되었는데, bfs와 투 포인터 두 가지 풀이가 가능했다. 일단 내가 그 문제를 먼저 잡고 구현을 시작했다. 내가 구현한 로직을 팀원 B에게 장황하게 설명했다. 팀원 B는 말했다. "그러니까 투 포인터를 쓴다는 얘기죠?" 나는 대답했다. "네." 참... 지금 생각해 보면 <마스터셰프코리아 시즌2> 강레오 심사위원과 최강록 참가자의 '차완무시' 대화가 떠오르는 대목이었다. 아무튼 내 로직을 팀원 B가 팀원 A에게 공유하니, 팀원 A는 반례를 말했고, 나는 미처 생각지 못한 부분이라 당황했다. 팀원 B는 내 풀이 말고 set을 이용해 bfs를 구현하자고 제안했는데, 나는 벙쪄서 어떻게 구현할 지 감이 오지 않았다. 그렇게 팀원 B가 그 문제를 잡게 되었고, 나는 내 로직을 다시 생각해 봤다. 투 포인터이긴 한데, 투 포인터에 걸맞지 않은 사용 방법이었다. 반례가 없는 풀이를 떠올린 그 순간, 팀원 B가 코드를 다 짜서 제출을 했고, TLE가 떴다. 팀원 A가 set 말고 unordered_set을 쓰면 통과될 것 같다고 해서, 다시 제출하니 약 1600ms로 AC를 받았다.

우리 팀은 D, F, K번을 보고 있다가 점심을 먹으며 생각을 했다. 그리고 점심을 다 먹고 나니 대회 종료까지 3시간이 남은 시점이었고, 솔직히 이때는 남은 시간 동안 한 문제는 더 풀지 않을까 싶었다. 의논 과정에서 D는 점점 선택지에서 없어지고, 팀원 A가 F번을 보고, 나와 팀원 B가 K번을 잡고 있었다. 2시간 30분에 걸친 끔찍한 케이스 워킹의 시작이었다. 어떤 로직으로 짜든 엣지 케이스가 있는 듯했다. 정말 소모적인 과정이었고, 특히 코드를 짜면서 로직을 구상하고 있는 팀원 B는 많이 지쳐 보였다. 나는 도중에 팀원 A와 F번을 보기도 했는데, 내가 F번에서 한 일은 고개를 끄덕하는 것뿐이었다. 하지만 그 끄덕임은 WA를 낳는 무지성 옹호일 뿐이었다.

대회 종료 20분을 남긴 시점에 나는 드디어 K번 풀이에 핵심이 되는 '두 개의 트리를 문제의 요구 사항에 맞게 하나로 합치기 위한 충분조건'을 찾아 냈다. 이번에는 정말 자명한 충분조건이었다. 그 조건은 대회 종료 이후 진행된 해설에서 소개된 3번째 성질이었지만, 로직을 구체화하려면 따져볼 것이 몇 가지 있었고, 다 따져보고 대강의 로직을 구상하고 나니 대회 종료 3분 전이었다. 재귀적으로 들어가야 해서, 어떻게 짤 것인지 정리하고 구현하기에는 부족한 시간이었다. 그렇게 우리 팀은 3솔로 대회를 마무리하게 되었다.


대회 종료 이후 2시간 30분

3솔이라는 원래 목표를 달성했지만, 한 문제를 끝내 풀지 못해 아쉬워 하며, 이후 일정이 진행되는 동안 계속 앉아 있었다. 허리가 끊어질 듯 아팠다. 출제진들의 해설을 보고 듣는데, 눈에 보이고 귀에 들리는 것은 있었지만, 머리에 남은 것은 없었다. 그냥 "대단하다"라는 경외심 뿐이었다. 대부분 초고난도의 문제였고, 역시 내로라 하는 실력자들도 풀이법을 말로 설명함에 있어서 건너뛰는 부분이 많이 있었다. 문제를 읽어보지도 못하고, 해당하는 알고리즘의 이름조차 처음 보는 나는 그냥 설명이 끝날 때마다 박수만 쳤다. 그 문제 풀이에 도전한 상위권 팀들은 아마 설명을 이해하고 있겠지 싶었다.


최종 스코어보드가 공개되고 우리 팀은 밑에서 5번째에서 찾아볼 수 있었다. 두 눈으로 직접 보니 아쉬움이 더 컸다. 그런데 뜬금 없이 우리 팀이 특별상을 받게 되었다. '가장 긴 채점 시간'으로 받게 된 것인데, 상당히 얼떨떨했다. "이게 칭찬인가..?" 역시 'PS러들의 축제'라는 이름에 걸맞는 재미 요소였다고 봐야 겠다. 마음의 준비도 못 하고 단상에 올라서 팀원들과 사진을 찍었다. 아쉽게도 그 사진이 지금은 없지만 곧 받을 수 있겠지. L번에서 팀원 A의 unordered_set이 아니었다면, 내가 개선된 투 포인터 풀이를 제출했을 것이고, 특별상과 마사지 건을 받고 사진을 찍을 일은 없었을 테다. 참 절묘한 일이었다. 아무튼 먼 길을 건너와 참가한 대회에서 '테이블에서 병뚜껑 떨어뜨리지 않고 최대한 멀리 날리기' 종목으로 상 하나 챙겨가게 되어서 감개무량했다.

프리즈 시점부터 대회 종료까지의 순위 변동을 다같이 보는 시간은 참 재미있었다. 놀라운 일을 해낸 팀도 있었고, 기억에 남을 만한 서사도 있었다. 5시간은 대회였고, 1시간 반은 요통에 시달렸지만, 마지막 한 시간은 정말 축제였다.


정리

팀에 더 많이 기여하고 싶어졌다. 이번 대회에서는 내 기여도가 많이 아쉬우니까. 실력을 더 키워야 할 것이고, 비판적인 시각도 길러야 할 것이다. PS 고인물들을 직접 보고, 같은 공간에서 경쟁하며 즐길 수 있어서 뜻깊었다. PS에 더 높은 벽과 더 많은 흥미를 동시에 느낀 시간이었다. 하반기에 치를 ICPC 본선에도 꼭 진출해서, 더 좋은 퍼포먼스를 내고 싶다.

+ Recent posts