알고리즘/오프라인 대회

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

kdh9949 2024. 4. 21. 04:59

1편에서 이어진다.

 

Luxor 가는 길

토요일 오후쯤에 공항에 팀원 셋이 모여서 출발했다. 룩소르는 깡촌이기 때문에 직항은 당연히 없고, 보통 카이로를 경유해서 간다. 근데 왠지 모르겠는데 인천-카이로 직항 편이 없어서 결국 인천-리야드(사우디아라비아)-카이로-룩소르 라는 2번의 환승을 거쳐야 하게 되었다.

리야드 공항에서 10시간 정도를 대기해야 했는데, 인천-리야드 비행기에서 잠을 거의 못 잔 덕에 의자에 앉아서 열심히 자면서 시간을 때울 수 있었다. 우여곡절 끝에 일단 카이로에 일요일 오전쯤에 도착했고, 하린이는 카이로-룩소르 비행기 표가 달라서 (소멤 지원 받는 것 때문에 약간 늦게 샀는데, 그 사이에 원래 사려고 했던 게 매진되었다) 공항에 놔두고 나랑 정현이 먼저 룩소르로 향했다. 국내선 타러 들어오니까 갑자기 PS 할 거 같이 생긴 사람들이 많이 보여서 안심이 되었다.

비행기는 룩소르에 오후 2시쯤 도착했는데, 내려서 짐 챙기고 셔틀버스 타고 호텔에 도착하니 거의 4시 다 되었다.

 

4/14 (일) - 도착

호텔이 아예 리조트 하나를 통째로 빌린 거라 일단 되게 좋아 보였다. 일몰 즈음에 나일 강변을 바라보면 그 경치가 상당했다. 그래도 돈 좀 썼나 보다 싶긴 했다.

저녁 식사는 호텔 식당에서 뷔페식으로 차려졌다. 생긴 건 좀 멀쩡해 보여서 기대를 했는데, 아쉽게도 맛은 그러지 못했다. 이걸 일주일 내내 먹을 생각을 하니 약간 눈앞이 깜깜해졌다.

일요일은 공식 일정이 아예 없었기 때문에 + 하린이가 오기를 기다려야 했기 때문에 먼저 도착해 있던 숭실대 팀 (jooddae 님 / edenooo님) 과 시간을 열심히 보냈다. JETBRAINS / HWAWEI 등 후원사 부스와 함께 탁구대, 당구대, 각종 보드 게임등을 설치해 놓은 공간이 있었는데, 하나씩 돌면서 나름 재미있게 했던 것 같다.

노는 도중에 옆에 한국말 하시는 모르는 분들이 계셔서 처음엔 그냥 룩소르 관광 온 한국인인 줄 알았는데, 알고 보니 숭실대 측에서 같이 따라오신 학생기자단 분들이셨다. 어쩌다가 jooddae님이랑 같이 붙잡혀서 인터뷰 영상도 찍었다.

하린이가 탈 비행기는 원래대로라면 8시 30분에 룩소르에 도착했어야 하는데, 지연이 좀 되었는지 호텔에 도착했을 땐 이미 11시 언저리였다. 너무 늦어서 등록은 내일 하기로 했다.

 

4/15 (월) - 신전 관광 + 개회식

이집트는 한국보다 7시간이 늦기 때문에 5시 정도 되면 알아서 깨는 듯 했다. 근데 5시는 너무 이른 것 같아서 그냥 좀 더 잤다.

Late registration이 시작하는 7시 30분에 맞춰서 나갔다. 등록하면서 뭘 자꾸 손에 쥐어줘가지고 집에 어떻게 다 들고 가나 생각했던 것 같다. 그리고 6번 zone인가에 사람이 아무도 없어서 스킵해도 되냐고 물어보니 그냥 가라고 했다. 뭐 하는 곳이었는지 아직 모르겠다. 등록하고 오는 길에 식당에 들러서 아침도 먹었다. 아침은 그래도 빵 같은 걸 집어먹으니 좀 더 먹을만 했다.

오전 10시쯤부터 신전에 관광을 하러 가는 일정이었고, 가는 길에 보트로 나일강 관광도 하는 듯 했다. 설명은 사진 몇 장으로 대체하겠다.

가는 길에 호텔에서 본 고양이. 카메라 들이대는데 안 도망가는 고양이는 처음이다.

 

보트 타고 나일강 따라가기

 

룩소르에 위치한 여러 신전 중 하나. 이름은 안 찾아봐서 모름

관광 일정 자체는 오후 2시 언저리에 끝났고, 바로 호텔로 돌아갔다. 돌아가는 길에 점심을 챙겨 줬는데, 무슨 뻑뻑한 빵에 뻑뻑한 고기조각 끼워넣은 샌드위치 + 생야채 + 기름&시럽에 쩔어있는 빵 몇조각 을 주는 걸 보고 이게 뭔가 했다. 샌드위치는 케첩을 뿌리지 않으면 먹을 수 없었다.

호텔 방에서 점심이랍시고 챙겨준 걸 대충 먹고, 이후 공식 일정이 전혀 없었기 때문에 뭘 할지 모른 채로 방에서 좀 빈둥거렸다. 다행히도 정현이가 보드게임을 하나 챙겨와서 그걸 숭실대 분들 (jooddae/edenooo/nlog님) 이랑 같이 했더니 저녁 먹을 시간까지는 버틸 수 있었다. 저녁은 일요일이랑 상황이 비슷했던 것 같다.

저녁 먹고 나서는 개회식에 참석하러 버스를 탔다. 개회식 장소가 Luxor Temple이래서 뭔가 했더니, 진짜 신전 옆에 무대 세워놓고 행사를 하는 거였다. 개회식 자체는 으레 그렇듯이 앉아서 폰질만 하다가 갔다. 시간이 많이 늦어서 호텔에 돌아오자마자 바로 씻고 잤다.

룩소르 신전의 야경

 

4/16 (화) - ICPC Challenge

7시 언저리에 일어나서 대충 아침을 먹고, 돌아와서 10시 언저리까지 누워 있었다. 화/수/목 3일 동안은 공식 일정이 거의 대회장에서 이루어졌는데, 오늘은 그 중 첫 번째인 HWAWEI ICPC Challenge가 있는 날이었다. 이게 뭐냐면, 후원사 중 하나인 HWAWEI에서 내는 최적화 문제를 3시간 동안 풀고 점수를 가장 높이 받은 N팀에게 화웨이 전자기기 (노트북 / 패드 /스마트워치)를 주는 대회다.

오전에는 tourist와 ecnerwala 둘이서 하는 Blind Coding Challenge라는 걸 관람했는데, 한 명은 모니터, 한 명은 키보드 만 보면서 Kotlin으로 같이 문제를 푸는 것이었다. 사실상 모니터 보는 사람이 하는 말을 키보드 잡은 사람이 받아적기에 가까웠는데, 그래도 그 과정에서 소통하는 게 나름 보기에 재미있었던 것 같다. 나중에 가니까 tourist가 키보드 잡고 자동완성도 해주더라.. 총 6문제를 풀었는데, 6번 풀 때 3번 코드 복붙해서 10줄 고치고 맞는 쇼를 마지막으로 올솔브(no WA)로 마무리했다.

오후에는 Challenge 대회를 치루었다. 사실 저번 WF 때는 3시간 내내 열심히 했는데 상품을 못 타서 이번에는 아예 대충 해야겠다 하고 자리에 앉았는데, 점수가 생각보다 잘 나와서(?) 결국 이번에도 3시간 내내 열심히 했다. 중간에 하린이가 "강화학습에서 이렇게 하던데" 라면서 랜덤 가중치를 부여해 후보를 여러 개 시도하는 전략이 유효했다. 결과는 전체 16등/ 47th 참가팀 중 12등 이었는데, 상을 뭐 어떻게 주는 건지 몰라서 일단 내일까지 기다리기로 했다.

저녁 먹을 때까지 어제 했던 보드게임을 이번엔 서울대 팀이랑 (+ 숭실대 nlog님) 했다. 저녁 먹고 와서는 어제랑 똑같이 침대에 누워있다가 잤다.

 

4/17 (수) - Dress Rehearsal

7시 언저리에 기상해서 아침먹고 10시 20분까지 누워있다가 대회 check in을 위해 이동했다. 폰을 갖고 들어갈 수 없었기 때문에 대기 시간이 정말 지루했다. 한 1시간쯤 멍때리다가 대회장으로 입장했다. 가는 길에 햇빛이 너무 더웠다. 다행히 대회장 안이 덥진 않았다.

Dress Rehearsal은 그냥 큰 부담 없이 키보드+시스템 적응한다는 느낌으로 치기로 했고, 나온 문제들은 역대 월파 기출 5문제 + interactive 연습문제 하나였다. 총 문제 수를 12개로 맞추기 위해 문제 하나당 2개씩 복사가 되어 있었다. C는 내가 쳤었던 19WF에 나온 못 푸는 문제였고, D는 좀 어려운 거 같은데 정현이가 풀어본 문제였고, 나머지는 그냥 쉬운 문제였다. 나름 열심히 했더니 47th에서 6등을 할 수 있었다. 47th 예비소집 1등은 KAIST였다.

Rehearsal이 끝나고 나서는 어제 했던 Challenge 시상식이 있었다. 46/47 팀 다 합쳐서 총 24팀한테 주는 거였고, 우리는 9~16등까지 주는 화웨이 패드를 상품으로 받았다. 당근에 올리면 누가 살지 모르겠다.

그리고 나서는 WF 출신으로 OpenAI에서 일하시는 분의 강연을 들었다. 말이 너무 빠르셔서 거의 못 알아들었는데, DOTA 2 하는 AI를 잘 만들어서 프로게이머를 이겼다 뭐 이런 얘기를 했던 것 같다. 그리고 강연 앞부분에서 Petr의 코딩 screencast 영상을 보면서 배운 점을 설명해 주었는데, "기본이 중요하다. 자신이 어떤 프로그램을 짜는지 정확히 알고 그것을 그대로 코드로 옮기면 버그가 들어설 자리가 없다" 이런 철학적인 이야기를 했던 게 기억에 남았다. 어떻게 하라는 건진 잘 모르겠지만 그럴듯한 이야기 같아서 마음에 담아두고 내일 대회를 치기로 했다.

저녁 먹기 전에 잠시 노는 공간에 갔다가 벌레가 너무 많아서 도망쳐 나왔다. 이 때쯤부터 입이 음식에 적응을 한 건지 밥을 그래도 나름 맛있게 먹을 수 있었던 것 같다. 다음 날은 본 대회기 때문에 컨디션 조절을 위해..서는 아니고 그냥 밖에 돌아다니기 싫어서 침대에 붙어 있다가 잤다.

 

4/18 (목) - World Finals / Awards Ceremony

대회 당일 역시 7시쯤에 깨서 아침을 먹고 숙소로 돌아와서 다시 침대에 누웠다. 사실 어제 7시에 일어난 뒤에 다시 안 잤더니 Dress Rehersal 때쯤 되어 갑자기 졸려졌어가지고 오늘은 꼭 숙소 나가기 직전까지 자야겠다고 생각은 했었는데, 그래도 대회 직전이라 그런지 잠이 다시 오지는 않았다. 약간의 긴장된 마음을 가지고 대회 check in 장소로 똑같이 이동했다. 서울대/카이스트 팀은 참가자 말고 아무도 이집트에 따라오지 않았기 때문에 숭실대에서 같이 오신 분들이 감사하게도 핸드폰을 다 맡아주셨다.

저번 WF 때는 그래도 대회 직전이 되니까 긴장이 좀 됐었던 것 같은데, 이번 WF는 직전이 되어도 긴장이 일정 수준 이상으로 올라오지 않았다. 그리고 근거는 전혀 없지만 왠지 대회를 잘 칠 것 같다는 이상한 자신감을 가지고 대회에 임했다.

 

대회 타임라인

총 11문제였고, 나는 평소와 같이 컴퓨터 앞에 앉아 ABCD를 읽었다. 다 슥 읽고 나니 A를 풀어야 할 것 같아서 일단 잡고, 뭔가 이렇게 하면 될 것 같은 걸 짜서 냈더니 바로 틀렸다. 내가 틀린 직후에 도쿄공대에서 맞는 코드를 냈던 것 같다.

일단 왜 틀렸는지는 깨달았는데, 그래서 어떻게 해야 할지 전혀 알 수가 없었다. 사람들이 계속 푸는 걸로 봐서는 쉬운 게 맞는 것 같긴 한데 나는 못 풀겠어서 더 늦기 전에 하린이한테 풀어달라고 던졌다. 하린이는 다행히도 풀이를 금방 냈고, 그냥 하린이가 짜라고 하고 컴퓨터 앞에서 나왔다. 그 사이에 정현이가 G의 풀이를 내서 나한테 알려주었다.

하린이는 A를 짜서 냈는데 역시 계속 틀려서, 그냥 딴 거부터 풀기로 했다. 역시 많이 풀리고 있던 I를 보기로 했는데, I는 특정한 사실을 알고 있다면 매우 간단하게 풀리는 문제이고 하린이가 그걸 떠올리는 데 성공하여 일단 빠르게 짜서 내서 맞을 수 있었다. 39분에 첫 솔브.

G는 이런 문제 와 비슷하게 한 정점 가중치를 고정하고 간선 따라 뿌려주는 방식으로 구현하면 되고, 내가 예전에 풀어본 적이 있었어서 다행히 안 틀리고 맞았다. G 짜는 도중에 하린이가 A도 디버깅에 성공하여 맞았다. 45분(A) / 52분(G) 솔브.

그리고 나서는 정현이가 그 사이에 풀어 놓은 D를 짜기로 했다. D는 피라미드의 한쪽 면을 바닥으로 눕힌다 생각하면 전형적인 기하 casework 문제가 되는데, 별 생각 없이 들어가서 짜다 보니까 코드가 어느새 100줄이 넘어가고 있었다..? 이거 냈는데 틀리면 큰일나겠다 싶은 채로 냈는데 진짜 틀려서 이때 또 마음이 약간 흔들렸다. 다행히 틀리게 되는 케이스는 금방 찾았고 (면을 눕혔는데 둘이 겹치면 이상해진다) 이걸 피하는 방법을 고민했는데, 일단 되는 대로 대충 처리해서 냈더니 맞아서 정말 다행이었다. 93분 solve.

그리고 나서는 정현이가 그 사이에 풀어 놓은 C를 짜기로 했다. 이 때 쯤에 하린이도 아마 H를 짜고 있었을 텐데 우선순위가 정확히 기억은 안 난다. 하여튼 C도 역시 기하 문제로 환원할 수 있었고, D보다는 구현이 훨씬 간단해서 D 코드 복붙해서 짰더니 완성 자체는 금방 할 수 있었다. 근데 예제가 하나는 나오고 하나는 안 나와서 이게 뭔 상황인지 한참 고민을 했다. 알고 보니 문제에서 D_1이랑 D_2를 정의해 놓고, 그걸 순서대로 주는 게 아니라 아무 순서로 줘 놓고 "이 조건을 만족하는 게 D_1이니까 너네가 알아서 찾아라" 라고 해놔서 그런 거였다. 그래서 고쳤는데도 계속 예제가 안 나오길래 도저히 이해가 안 돼서 코드를 한참 쳐다보고 있었다. 내가 이러고 있는 사이에 하린이가 다행히 H를 맞았고 (139분) 그 직후 나도 원인을 찾아서 (계산해야 하는 값을 1/2를 곱해서 계산하고 있었다) 고치니까 예제가 둘 다 나왔고, 그대로 내서 맞았다 (145분).

그리고 나서는 정현이가 그 사이에 풀어 놓은 F를 짜기로 했다. 이 때부터 하린이는 K를 제대로 잡기 시작했다. F는 타일들 특정 방향으로 기울여서 움직이는 거 짜고, KMP 짜고, modulo 연립방정식 해 있는지 판별하는 거 짜면 되는 문제였는데 다 짜니까 코드가 엄청 길었던 것 같다. 아무튼 예제가 잘 나오는 듯 해서 냈는데 틀렸고, 프린트해서 한번 쭉 봤는데 내가 코드를 너무 잘 짜놔서 왜 틀렸는지 전혀 모르겠었다. 다행히도 곧 초기 조건 몇 개를 빼먹은 걸 찾았고, 내가 짠 코드는 잘 짠 게 맞았다. 그걸 고쳐서 내니까 맞았다 (219분). 하린이는 K에서 "강화학습에서 이렇게 하던데" 하는 얘기를 하면서 반복적 iteration을 통해 DP값을 수렴시키는 식의 풀이를 냈는데, 예제가 나오는 코드를 내니까 한 번에 맞았다. (230분). 이 때쯤 메달 획득을 속으로 확정했던 것 같다. 프리즈 시점의 순위는 4등이었고, 한 문제 더 풀면 금도 노려볼 수 있겠다 싶었다.

남은 시간 동안은 B밖에 풀 게 없어 보이길래 B를 다같이 잡았고, 그럴듯한 풀이를 냈으나 아쉽게도 틀린 풀이였다. 솔브 수를 추가하지 못한 채로 대회가 끝났고, 그래도 은메달은 딴 것 같아서 일단 안심하기로 했다.

 

8 solve

 

끝나고 나와서 46th 쪽에 구경을 가니, 그 쪽 역시 서울대 팀이 메달 안정권에 올라가 있었다. 한국 팀들끼리 모여서 약간 떠들다가 시상식 가는 버스를 타러 나갔다. 근데 얘네들이 공지고 통제고 아무것도 알려주는 게 없어서 길바닥에 한 20분 서 있다가 버스를 탔던 것 같다. 시상식은 Secret Place에서 한다고 적혀 있었는데, 도대체 어딜 가는 건가 했더니 진짜로 한 1시간 정도 달려서 사막 한복판에 있는 유적지 같은 데 도착했다.

같이 메달을 받는 서울대 팀이랑 같은 테이블에 앉았다. 준비 되어 있는 저녁 식사는 별로 기대는 안 했지만 역시나 그저 그랬다. 밥 먹는데 계속 시끄럽게 공연 같은 걸 해서 좀 별로였다.

시상식은 역시나 지루한 연설 n번으로 시작하고, 그 다음에 스코어보드 까는 시간이 있었다. 스코어보드 까는 것도 두 개를 동시에 까다 보니 굉장히 루즈해졌고, 옆에서 자원봉사자들이 시상식 하든지 말든지 모여서 사진 찍으면서 소리를 질러 대는 통에 정신이 한 개도 없었다. 대충 이때쯤에 상 안 받는 팀들은 거의 먼저 돌아간 것 같다.

어쨌든 기다리고 기다려서 메달 받는 시간이 되었고, 앞에 나가서 메달을 받았다. 그래도 막상 상을 받으러 올라가니 실감이 좀 나기도 했고 기뻤다. 등수는 저번에 나갔을 때랑 똑같은 7등이었다. B를 풀었으면 금메달일까 생각했는데, 알고 보니 페널티 때문에 9솔 했어도 은메달이어서 별로 안 아쉬워졌다. 그리고 저번에는 도쿄대가 너무 잘 해서 Asia Pacific Champion은 못 했는데, 이번에는 46th/47th 모두 서울대가 도쿄대를 이겨서 Asia Pacific Champion을 두 개 땄다.

7th place, with Asia Pacific Champion

버스 타고 숙소로 돌아오니 12시 언저리였고, 다음 날은 5시 반 쯤에 호텔을 떠야 했기에 그냥 빨리 씻고 짐 싸고 잤다.

 

집 가는 길

새벽같이 호텔을 나와서 집 가는 비행기에 올랐다. 앞으로 중동은 다시 올 일 없을 것 같다.

 

소감

이번 47th WF 셋은 솔직히 별로 좋은 셋은 아닌 듯 하지만, 그래도 우리 팀에게 꽤 유리한 셋이긴 했던 것 같다. 구현량이 많은 셋일수록 나는 거의 코딩만 담당하고, 하린이와 정현이가 풀이를 거의 내게 된다. 근데 이번 셋은 문제들이 하나같이 내가 풀기 싫어하는 문제들이었고, 내가 잘 모르는 부분들도 많았는데 그 부분을 잘 채워주어서 풀이도 금방금방 나오고 내가 구현을 잘 할 수 있었던 듯 하다. 문제 셋 운도 좋았고, 나를 포함한 팀원 세 명이 모두 각자 역할을 잘 해서 낼 수 있는 거의 가장 좋은 결과를 낸 것 같다.

ICPC WF에 대해 별 생각도 기대도 안 하고 큰 뜻 없이 짠 팀이었는데, 어느샌가 이렇게 WF에서 메달을 받았다는 게 아직까지도 실감이 잘 안 나는 것 같다. 프리즈 시점에 우리 팀이 스코어보드 4등에 있는 걸 보고서도 이게 진짜가 맞나 싶었다. 모든 대회가 그렇겠지만 ICPC 역시 대회 성적이 운에 의해 많이 좌우되는데, 나는 대체로 운이 매우 좋은 편이었다고 생각한다. 이번 대회는 특히 나가는 데 까지 많은 우여곡절이 있었지만, 결론적으로 이 모든 과정이 메달을 딸 수 있도록 도움이 되는 방향이었다고 생각하기로 했다.

이제 진짜로 ICPC 은퇴 했으니, 정말 마음 편하게 ICPC 대회 치는 걸 구경할 듯 하다. Asia Pacific Championship의 도입으로 더욱 많은 한국 팀들이 WF에 진출하게 될 것 같은데, 모두들 좋은 결과 있기를 바란다.