본문 바로가기

카테고리 없음

ICPC World Finals 2025 후기

ICPC World Finals 2025에 서울대학교를 대표해 팀 DaXingHao(컴퓨터공학부24 이동현, 컴퓨터공학부24 이성호, 수리과학부23 최다니엘)로 출전하였다. 10등으로 동메달을 수상했다.

 

1. 대회 전

 

준비 과정, 팀의 목표를 이야기하는 파트이다. 귀찮다면 대회 중 파트로 넘어가도 좋다. 

 

2022 선발고사 이후 이토록 열심히 준비한 대회는 없었다. 그도 그럴 것이, 2023~2024년에 백준 제출 기록이 거의 없을 만큼 ps를 하지 않았기 때문이다. 아시아 챔피언십을 말아먹은 뒤 ps를 다시 시작했는데, 3월부터 7월까지 정말 열심히 했다. 백준/Codeforces에서 주로 트레이닝했으며 이 기간 동안 내 실력이 크게 늘은 것을 많이 체감했다. CF는 2780을 찍었다. 진작 이렇게 열심히 할 걸 후회가 되는 기간이기도 했다.

 

8월 초에 2주간 여행을 다녀오면서, 뭔가 의욕이 감퇴했다. 8월부터 대회 전까지 팀 연습 제외 ps를 별로 하지는 않았던 것 같다.

 

우리 팀의 목표는 메달이었다. 최근 서울대의 성적을 본 사람들이라면 의아하겠지만, 목표를 절대 낮게 잡지 않았다. 메달이라는 목표가 낮지 않은 이유는 다음 세 가지로 요약할 수 있다.

 

먼저, 우리 팀은 최근 서울대의 ICPC World Finals 출전 팀들보다 약하다. 최근 서울대 팀들을 보면 Lgm이 포함되어 있거나 kdh9949와 같은 든든한 초강자가 포함되어 있는데, 우리 팀이 저 팀들보다 강하지 않은 것은 사실이었다. 또한, ICPC World Finals의 출전 팀은 매년 갈 수록 강해지고 있다. 금메달권같은 극 상위권은 잘 모르겠지만, 상위권 팀들이 매년 강해지고 있는 것은 사실이다. https://zibada.guru/finals 에서 확인할 수 있다. 마지막으로, 성호가 모종의 이유로 긴 기간 동안 ps를 하지 못 했기 때문이다. 특히 월파같은 셋은 구현의 중요도가 꽤나 높은데, 키보드를 오랜만에 잡으면 구현에 어려움을 겪을 수 밖에 없어 이런 부분이 걱정되었다.(실제로 예비소집에서 구현이 꽤나 까다로운 2023 G번이 나왔는데, 성호가 잡고 끝까지 맞지 못하였다.) 성호는 매우 똑똑하기에 성호의 풀이 내는 능력은 전혀 의심하지 않았다.

 

서울대학교는 2017~2024 8년 메달스트릭을 가지고 있었다. 내가 아는 한 전 세계 모든 대학 중 가장 긴 메달스트릭 기록을 보유하고 있었기에 메달 수상에 대해 부담을 느끼는 부분도 없지 않았다. 높은 메달을 바라기보다 메달 유무가 중요한 느낌이었다.

 

대회 전/전전 날에 키보드를 체험할 수 있었는데, shift/enter 키가 반토막나있었다. 정말 구현을 못하겠어서 shift 주변의 키들을 모조리 빼고 진행하였다. 그럼에도 내 구현 속도는 최소 2배 이상 느려졌다. 컴퓨터 세팅도 대회 시작 후 해야한다는 것도 알았다. 지금까지 월파 버추얼을 돌아서 낸 성적은 별로 의미가 없음을 깨달았다. 현장에서는 더 긴장도 되어 실수도 많이 할 것이고, 구현도 매우 느려지고, 세팅도 시작하고 해야하는 등 다양한 이슈들이 많기 때문이다. 이런 이유에 의해 대회 전 메달 수상 가능성에 대해 매우 회의적이었다.

 

신기하게도 대회 시작 전 까지 긴장이 되지 않았다. 이 대회를 정말 열심히 준비했고, 나는 긴장을 정말 많이 하는 타입인데도 그렇다. 호텔에서 대회장으로 가는 버스에서도 긴장되지 않았다. 내 옆에서 하버드의 모 팀원이 막 토하고 있었는데, 이렇게 긴장 많이 하는 사람들을 보고 "내가 이렇게 편해도 되나"하는 죄책감까지 느껴졌다. 카이스트 팀과 대기실에서 서로 응원해주고, 대회장에 대학 팻말을 들고 웅장하게 입장할 때도 긴장이 되지 않았다. 아마 대회를 치는 것이 실감 나지 않았던 것 같다. 많은 분들이 긴장하지 말라고 응원해주셔서 감사했다.

 

매년 World Finals는 예정보다 일찍 시작한다. 대회장의 매우 큰 스크린에 남은 시간을 띄워주는데, 모든 준비가 끝났을 경우 스크린 상의 표기된 시간이 빨리감기되어 1분으로 조정된다. 나는 이 사실을 이미 알고 있었지만 직접 당하니까 매우 당황스러웠다. 시간이 돌아가고 정신을 차려보니 33초가 남아있었고, 이 순간 매우 긴장되었다. 인생에서 최대 2번밖에 칠 수 없는 대회인데, 그 중 한번을 소모한다고 생각하니 더욱 긴장되었다.

 

컴퓨터를 로그인 할 준비 및 문제지를 뜯을 준비를 하니 카운트다운이 시작되었다. 5, 4, 3, 2, 1. 빌 파우처 손자의 "The contest has started!!"를 시작으로 대회가 시작되었다.

 

2. 대회 중

 

내가 ABCD, 성호가 EFGH, 동현이가 컴퓨터 로그인/vscode 세팅 후 IJKL을 보기로 하였다. 나는 순서대로 읽다가 B의 지문이 매우 짧고 문제가 쉬워보여 B의 고민을 시작했다. 6분 째 예상치 못하게 매우 이른 타이밍에 전체 퍼솔(L)이 나왔다. 아마 StarSilk가 포함된 팀으로 기억했는데, L 지문이 읽기 싫게 생겼는데 6분 째에 푸는 것이 신기했다. 동현이가 세팅 후 I를 읽는 중에 급히 L로 꺽어서 해결하였다.

 

L (+0, 0:14)

 

EFGH를 읽던 성호는 F를 풀었다고 주장하고 컴퓨터를 가져가서 구현하였다. 나는 14분 동안 B를 보는 절대 해서는 안 되는 판단을 했는데, 뭔가 되게 쉬울 줄 알고 꼭 풀어야 한다고 생각했었다. L을 푸는 순간 D의 퍼솔이 나왔는데, 난 D를 보지도 않아 L을 풀고 나온 동현이에게 넘겼다.

 

성호가 F의 구현을 마치고 제출하였는데 틀렸다. 출력 요청을 하고 동현이가 D를 짜기 시작하였다. D를 짜는 중 F의 수정할 부분을 찾아 다시 제출하였는데 이번엔 런타임에러를 받았다. 나는 옆에서 팀이 멸망하고 있는 소리를 들으며 정신차려 B를 버리고, 퍼솔이 나온 I의 지문을 읽기 시작했다.

 

동현이가 D를 맞았다.

 

D(+0, 0:31)

 

I는 Codeforces에 자주 나올 것 같은 인터랙티브 문제였다. 나는 이런 문제를 좋아하여 나름 재밌게 풀고 있었다. 사실 팀의 상황이 그렇게 좋지 않아 즐기지는 못했다. 다행히 플래티넘 중위권의 쉬운 문제였고, 풀이가 적당히 이른 시간에 나와 구현을 시작하였다. 옆에서 동현이가 성호의 F를 도와주러 갔다.

 

내가 I를 맞았다. 인터랙티브 테스팅이 어려워 5분을 더 소모했다.

 

I(+0, 0:44)

 

성호 및 동현이가 코드의 틀린 점을 오랜 기간 잡지 못해, 동현이가 밀고 다시 짰다. J의 first solve가 나와 내가 J를 봤고, 성호는 E가 쉬울 것 같다고 E를 봤다. 동현이의 F코드의 예제가 나왔다.

 

제출하기 직전 갑자기 동현이가 성호 코드의 틀린 점을 머릿속에서 찾아냈다. 아마 입력을 다 받지 않고 중간에 return 0;을 한게 문제가 되었다고 했던 것 같다. 성호가 약 30분 동안 검토한 코드 vs 방금 다 짠 동현이의 코드 중 어느 코드를 제출할 지 고민하다가 성호 코드를 제출하였다. 다행히 맞았다.

 

F(+2, 0:58)

 

J는 내가 좋아하는 유형의 constructive였는데, 페널티가 좋은 상황이 아니라 틀리기 싫어서 풀이의 증명을 모두 다 해두었다. 플래티넘 상위권의 어렵지 않은 문제였다. 구현 후  20개의 예제를 손으로 넣어본 뒤 제출하였고, 정답을 거의 확신하였다. 맞았다.

 

J(+0, 1:19) 

 

성호가 E 풀이를 냈다고 주장하고 동현이가 검토하여 E를 짜기 시작했다. 짜는 도중 small-to-large 템플릿을 다 작성한 동현이가 풀이의 반례를 찾아 짜는걸 중단하였다. 나는 B를 조금만 더 보다 H, K 솔브가 있어 내가 K, 성호랑 동현이가 H를 같이 봤다.

 

K는 플래티넘 상위권~다이아 하위권의 어렵지 않은 문제였다. 여기서 절대 하지 말아야 하기로 다짐한 상황이 등장했다. 바로 구현 구체화를 하지 않고 구현을 시작한 것이다. 풀이의 90%를 생각해 놓고 나머지 10%는 제대로 생각하지 않아, 코드를 막 짜다 보니까 이 다음에 무엇을 짜야할 지 고민해야 할 상황이 왔다. 심지어 제대로 된 결론을 내지도 못해 성립하지 않는 이분탐색을 짰다가 예제가 안 나오기도 하고, 많은 실수를 하였다. 코드는 120줄을 짰는데 여기에 실수가 있을 지도 모르는데, 아직 검토도 하지 못하였다. 일단 머리가 터질 것 같아 풀이가 나온 H에게 컴퓨터를 넘겨주었다.

 

이 시간대에 극심한 패닉이 왔다. 나머지 둘은 H 구현/A 풀이에 잡혀있었고, 결국 K를 해결해야 하는 것은 나였다. 그런데 대체 무엇을 해야할 지 몰랐다. 침착하게 생각을 5분만 하면 정답이 나올 것 같았는데, 침착할 수가 없었다. 너무 떨리고 숨이 가빠지고 정신이 나갈 것 같았다. 이런 상황이 25분정도 지속되었다. 솔직히 말하면 울기 직전까지 갔다. 글로 그 때 느낀 감정을 다 표현할 수 없지만, 매우 스트레스 받고 다시는 경험하기 싫은 순간이었다. 옆에서 H의 예제가 나오지 않자 팀원들은 H의 문제를 잘못 읽었는지 의심하고 있었고, 등수는 39등까지 떨어지고 있었다. 팀이 멸망 직전인 것 같아 논리적인 사고가 어려웠다. 원래 멘탈이 나가도 팀원에게 티를 안내려고 노력하는데, 너무 정신이 나갈 것 같아서 정신 나갈거 같다고 몇 마디 했던 것 같다.

 

K는 잘 생각해보니 이미 정답 코드를 다 짜놨던 것이고, 출력 부분 한 줄만 수정하면 정답인걸 깨달았다. 하지만 어찌어찌 수정한 코드는 wa가 나왔다. 디버깅을 하려던 찰나 골똘히 생각해보니 max하나를 +로 바꿔야 맞을 것 같다는 생각이 들었다. 그와 동시에 H의 정답코드를 짠 동현이가 H를 제출하였다. H의 제출이 도는 동안 K를 수정하고 제출하였다.

 

H(+0, 2:40)

K(+1, 2:41)

 

 

둘 다 맞으면서 생사의 기로에서 생존에 성공하였다. 10등까지 복구하였다.

 

K/H를 짜는 동안 성호가 A의 풀이를 생각해놓았다. 종이에 풀이를 정리해놓았는데 A4용지 한 페이지가 가득 차는 casework 구현 문제였다. 여기서 무책임한 행동을 했는데, 검토 한 번 없이 A를 성호한테 맡기고 동현이와 B/E풀이를 내러갔다. 가뜩이나 키보드를 잡은지 오래된 성호한테 160줄의 빡센 구현을 검증없이 투척한 것이다. ucpc때 비슷한 이유로 멸망한 적이 있기도 하고, 이런 행동은 팀의 미래를 도박하는거랑 마찬가지다. 당시에는 이런 생각을 전혀 하지 않았다.(못했다.)

 

성호가 구현을 시작한 지 35분이 넘게 흘렀고, 나는 동현이와의 환상적인 팀워크를 통해 B의 풀이를 냈다. B는 다이아 상위권의 어려운 문제로, 문제에서 필요한 관찰들을 서로 번갈아 내면서 물 흐르듯이 풀이가 나왔다. 풀이를 거의 다 낸 후 정리할 시점 성호가 코드 짜는 것을 멈추고 제출창을 보고 있었다. 알고보니 몰래 제출했고, 내가 눈치챘다. 본인이 나중에 이야기하길 매우 높은 확률로 틀릴 것이라고 생각해서 그랬다고 한다. 나같아도 160줄짜리 casework 문제를 짜면 몰래 제출했을 것 같다.

 

A(+0, 3:21)

 

성호가 팀 이름값을 해냈다. 역시 중요한 순간에 강한 사람은 따로 있는 것 같다.

 

이보다 더 좋은 상황이 있을 수는 없었다. 어려운 문제인 B 풀이는 거의 확실했고, 동현이가 B를 구현할 동안 E를 나와 성호가 풀어내면 대회를 성공적으로 마무리할 수 있겠다는 생각이 들었다. 동현이의 B 구현을 봐준 뒤 E를 조금 고민하고 있었다. 그러나 28분만에 구현을 마친 동현이가 B를 제출했으나 틀렸다. 스코어보드가 프리즈되었다.

 

일단 B를 푸는게 중요한 것 같아, 풀이를 아는 내가 디버깅을 도와주러 갔다. 그 동안 성호는 E풀이를 내려고 노력중이었다. 하지만 아무리봐도 B코드에는 틀린점이 없었다. 진짜 모르겠어서 전체를 갈아엎고 내가 다시 짰지만, 여전히 틀렸다. 대회 33분남은 시점이었다.

 

23분쯤 남았을 때 성호가 E를 못 풀겠다고 선언하고 B를 도와주러 왔다. 나랑 동현이는 둘 다 짰으나 둘 다 틀렸기에 풀이가 틀렸다고 의심하고 있었다. 성호에게 B 풀이를 설명해주고 틀린점을 찾자고 하였다. 성호는 풀이를 유심히 보고 코드를 슬쩍 봤는데, 갑자기 lower_bound실수를 찾았다. V를 소수들이 모인 벡터라고 하면, n/4초과의 가장 작은 소수를 찾으려면 lower_bound(n/4+1)을 호출해야하는데, 나랑 동현이 모두 lower_bound((n+3)/4)를 호출하는 실수를 했다. 동현이 코드에서 (n+3)/4를 n/4+1로 고쳐 제출하였다.

 

B(+2, 4:42)

 

성호가 팀 이름값을 해냈다. 역시 중요한 순간에 강한 사람은 따로 있는 것 같다.

 

어쨌든 18분이 남았고, 세 명이서 E를 보기 시작했다. 사실 가망이 없는 것은 셋 다 알았을 것이다. 어떻게 18분만에 월드 파이널에서 4번째로 어려운 문제를 풀고 구현까지 완료할 수 있겠는가. 하지만 안 볼수는 없었기에 셋이서 열심히 고민했다. 그런데 14분정도 남았을 시점, 동현이가 B를 짤 때 내가 무의식중 했던 생각이 풀이로 연결되어 갑자기 풀이가 나왔다. 말 없이 컴퓨터를 잡았고, 팀원들도 말 없이 컴퓨터 주위에 둘러싸 이상한 구현을 하지 않는지 봐주기 시작했다.

 

사실 절대 못 짤 것이라는 것도 알고 있었는데, 이전에 짜던 small-to-large 템플릿이 남아 있어 희망을 버리지 않았다. 익숙하지 않은 키보드도 이 순간에서는 잘 쳐졌던 것 같다. 어찌어찌 80줄짜리 코드를 구현하고 3분이 남아 예제를 돌려보는데, 결국 예제가 나오지 않고 대회가 종료되었다.

 

3. 대회 후

 

E를 못 짠 것은 별로 아쉽지 않았다. 18분동안 E를 풀 확률은 1%미만이었기 때문이다. 가장 아쉬웠던 점은 B의 매우 사소한 실수로 60분을 날렸던 것이었다. 많이 아쉬운 상황에서 대회가 끝났기에 끝난 후 정적이 이어졌지만, 고려대팀이 우리와 합류하고 유쾌한 stonejjun님이랑 대화하면서 분위기가 많이 풀렸다.

 

한국 팀 중 메달 가망이 있는 팀은 우리밖에 없었고, 그 마저도 불확실했다. 고려대 팀은 8솔브로 분위기가 나쁘지 않았고, 포스텍 팀은 만나뵙지 못하였다. 카이스트 팀은 말걸기가 매우 무서울 정도로 분위기가 안 좋았다. 우리 팀의 아쉬운 점을 생각하느라 너무 아쉽고 머리가 아팠고, 카이스트 팀도 친한 친구들인데 마음이 많이 아팠다. 뭐 어떻게 위로의 말을 전하기도 힘들 정도였다.

 

대회장에서 시상식장으로 가는 버스 안에서 성호와 이야기해봤을 때는, 성호는 메달 가능성을 50%이상으로 봤던 반면 나는 30%정도로 생각했다. 나는 E의 풀이가 어렵지 않다는 것을 알기에 더 낮게 추측했던 것 같다. 스코어보드를 볼 시간도 없어서 대충 느낌상 추측했다. 시상식장에서 Saratov State University의 코치가 와서 우리의 솔브수를 물어봤다. 이를 통해 Saratov State University가 프리즈 이후 B를 풀지 못했다는 것을 알게 되었다. 그 외 스코어보드 프리즈 상황과 MIT코치로 간 구사과님이 들은 여러 정보를 취합해 보았을 때, B가 생각보다 더 어려운 문제였고 많은 팀들이 풀지 못했다는 것을 깨달았다.

 

시상식이 적당히 진행되던 중 구사과님한테 동메달이 거의 확정이라는 소식을 듣게 되었다. 대회가 끝났을 때는 너무 아쉬웠는데, 메달 소식을 들으니 아쉽기보단 눈물나게 기뻤다. 팀원 모두 만족하였다. 우리 목표는 메달이었고, 달성했다. 일주일이 지난 지금도 시상대에 걸어나갈 때 느낌을 잊지 못하겠다. 이래서 PS 하는구나 싶었다.

 

우측은 Co-Coach로 참여한 서울대학교 Osman Allazov이다. 컨디션 관리 및 관광에 도움을 주어 매우 감사하다.

 

숙소에 도착해서 침대에 누워서 대회를 복기하였다. 목표는 메달이었고 달성했지만, 사람이 욕심이 많은 것은 어쩔 수 없나보다. 스코어보드를 보면 팀들 사이 간격이 매우 촘촘해서 B를 조금 일찍 맞아서 E를 풀기만 했더라면 금메달이고, B를 일찍 맞기만 하더라도 은메달이었기에 매우 아쉬웠다. 그러나 돌아보면 아쉬웠던 부분도 있지만 대회가 완전 터질 뻔한 부분이 훨씬 많았다. 13등과의 페널티 차이가 60분가량이기에 성호가 A에서 말렸더라면, 내가 K에서 더 말렸더라면, 동현이가 구현이 어려운 H에서 말렸더라면, 그리고 성호가 마지막에 B의 오류를 잡아주지 못했다면 그대로 메달을 따지 못했을 것이다. 실제로 우리 팀 보다 훨씬 잘하는 몇몇 팀들도 메달을 따지 못한 것을 보면, 만족하는게 합리적이라는 생각이 들었다.

 

서울대의 메달스트릭은 폭탄 돌리기가 되어버렸다. 폭탄을 터트리지(메달스트릭을 끊지)않았고, 성공적으로 다음 팀에게 넘겨주었다. 그리고 폭탄을 받는 그 다음 팀이 되고자 한다. ICPC 2026 World Finals를 향해 정진하겠다.