2025 KAIST 15th ICPC Mock Competition 후기 (Road to ICPC APAC 2026 Part 3.5)
2025년 10월 26일 진행된 제15회 KAIST ICPC 모의대회에 참가했습니다. 팀명은 Kpop Ssalhur Hunters로, 서울대의 ICPC 팀 Ssalhur의 denniskim, iccodly와 저희 팀 Kpop Ssal Hunters의 저(annyeong1)로 이루어진 팀입니다. 결과는 6+971/13=#28으로, 역대급으로 미친듯이 박았습니다.
팀 결성
원래 저희와 쌀후르 팀 모두 완전체로 나갈 생각이었습니다. 그런데 Ssalhur의 jk410과 Kpop Ssal Hunters의 juwonhyme, starbucks_americano가 중간고사 일정으로 불참하면서 남은 인원을 합쳐서 출전하기로 했습니다.
팀명은 두 팀명을 매우 자명하게 합친 팀명을 사용했습니다. 예비 팀명은 RGB_ICPC_from_TEMU였습니다.
대회 전날
팀노트를 합치려 했지만, 별로 팀노트에 많은 시간을 쓰기 싫었고, 심지어 쌀후르 쪽은 팀노트의 텍 파일도 없어서, 그냥 저희 팀노트에서 적절히 추가와 제거를 하기로 했습니다.
봄 대회때처럼 팀노트 1페이지에는 작은 사진을 적어갔습니다. 이번에 쓴 사진은 다음과 같습니다.
생각보다 이거에 시간을 많이 박았습니다.
당일 오전
ryansmg와 같은 기차를 타고 10시 정도에 대전역에 도착했습니다. ‘10분 뒤에 오는 사람을 기다리기’를 n번 반복했고, 1시간 정도동안 대전역에서 아무것도 안한 사람이 되었습니다. 아무튼 팀원 iccodly를 포함 대략 7명 정도가 모여서 택시 두 대로 카이스트로 이동했습니다.
밥은 대충 교내의 퀴즈노스에서 때웠습니다. 퀴즈노스는 런대회에 가면 항상 먹는 명물입니다. 퀴즈노스에서 평화롭게 점심을 먹고 있던 40기 josephan8375를 만났습니다. 아쉽게도 대회에 참가하지는 않았습니다.
그러고 회장으로 이동했습니다. 건물으로 가는 길에 SEVERANCE 팀을 뵈었고, 외에 대회 참가자이나 문을 찾지 못하신 분들을 몇 분 관측할 수 있었습니다. 이번에도 N1 문앞에 상주하는 운영진은 없었습니다. 봄에는 flappybird 전화번호로 “저 안녕원인데, 여기 어케 들어감?”을 시전했는데, 이번에는 전화를 받지 않았습니다. 다행히도 지나가던 어떤 재학생의 뒤를 따라 건물에 들어갈 수 있었습니다.
들어갈 때쯤에는 회장에 사람이 많지 않았습니다. 팀원 denniskim이 먼저 와 있었어서, 등록을 하고 자리를 잡았습니다. 등록 때 Kou, RIKKA, ibm2006, Kaling, cocoa_chan에게 팀노트(에 붙어있는 사진)를 보여주었고, 호평을 받았던 것이 기억에 남습니다. 사진 하단에 매직쇼 드립이 있었는데, 과연 Kou, RIKKA, ibm2006, Kaling, cocoa_chan가 봤을지는 모르겠습니다.
열심히 돌아다니면서 인사했습니다. 운영진인 sch05님, flappybird님, ai4youej님, 작년 몰라 그냥 아무거나 하셈 조합의 팀원이었던 Equinox_와 jununu0811, 대회 전날 넥슨 쌀을 매우 많이 받아낸 팀명 불명의 dadas08, realpsdoingdamyoo, woohyunjng, 핸들이 본명보다 익숙한 42기 몇 명과 mj1000j 및 얼굴 잘 모르는 43기 몇 명, 카이스트 코끼리바위보 팀의 cywohoy님과 octane님 등과 인사했습니다. 그러고 자리로 가니 바로 앞자리가 42기 중국1황다다수 팀이었고, 그 앞이 Rock kokkiri Paper 팀이었습니다.
다다스의 얼굴을 팀노트에 박아온 팀을 5팀 내외로 확인할 수 있었습니다. 저는 이것이 팀의 퍼포먼스에 음의 기여를 한다고 생각해서, 왜 그런 짓을 하는지 이해하지 못했습니다. 그러나 대회 결과를 보면 다다스의 얼굴보다는 사후르와 쌀숭이와 쌀후르가 훨신 큰 음의 기여를 준 것 같아서, ICPC 본선에는 저희도 다다스의 얼굴을 지참해야 하나 생각했습니다.
먹을 다과가 많았고, 특히 쌀과자가 있었습니다. 처음에 까까 수급을 할 때 개쩌는 협시야각으로 쌀과자를 보지 못했는데, iccodly가 쌀과자를 관측해준 덕분에 팀 이름값을 할 수 있었습니다.
Ssalhur 팀의 원 팀명은 RGB_ICPC이고, 이 팀은 R을 담당하는 iccodly (성씨가 Rhee)가 앞 문제, G를 담당하는 denniskim (성씨가 Gim)이 중간 문제, B를 담당하는 jk410 (성씨가 Bark)가 뒷 문제를 잡고 시작하는 전통이 있습니다. 그래서 iccodly, denniskim과 팀연습을 할 때는 - 이 조합은 일반적으로 Strong Riceachability 팀명을 사용하는데 - 제가 B를 담당해 뒷 문제를 잡고 시작하곤 합니다. 이번에도 그렇게 하기로 했고, 특히 작년처럼 13문제가 나올 것이라 예상했기 때문에, 코드포스 레이팅이 오렌지, 오렌지, 오렌지라 팀 전력의 60%를 담당하게 되는 denniskim이 처음에 머신을 잡은 채로 5문제를 보기로 했습니다.
0:00~0:23
- 실제로 13문제가 나와서, J, K, L, M을 잡고 시작했습니다.
- 문제 제목들이 다 리듬게임 곡 제목이었습니다.
Kou,RIKKA,ibm2006,Kaling,cocoa_chan이 또 이상한 짓을 했구나 생각했습니다. - 7분 정도 걸려서 모두 읽었고, 4문제 모두 어렵다고 생각했습니다.
- 스코어보드에 A와 B가 풀렸고,
iccodly가 B가 풀리는 것이 말이 안 된다고 주장해서, B를 뺏어왔습니다. - 서로 다른 문자가 이웃해 있으면 무조건 자르는 것이 이득이라는 가설을 세우고
iccodly에게 주장했지만, 틀렸습니다. - 길이 3 이상의 블록은 나오면 안 된다는 가설을 세우고
iccodly에게 주장했고, 예제가 다 되는 것 같았습니다. - 머신을 가져와서 구현했고, 맞았습니다. (23분)
- A와 B가 모두 많은 팀에 의해 풀렸기 때문에, 시작이 조금 늦었다고 인식했습니다. 그러나 아무튼 괜찮다고 생각했습니다.
0:23~1:27
- A와 B가 아주 많이 풀리고 있었고, G의 퍼솔이 나왔습니다.
iccodly가 A를 구현하려고 머신을 가져갔고,denniskim이 G를 잡았습니다.iccodly가 C를 줘서, 저는 제 문제들과 C를 읽었습니다.- 저는 그중 K가 할만하다는 것을 알아냈습니다. 풀이를 내고 퍼솔이 나온 C로 갔습니다.
denniskim이 G를 풀었다고 주장했고, 시간이 거의 안 걸린다고 했습니다. 그래서iccodly가 A를 완성하는 대로 G, K 순으로 풀기로 했습니다.- 이때 기준으로, 아마 풀린 모든 문제의 풀이를 들고 있었습니다. 대회 초반이기에, 누군가 쉬운 문제에서 말리지만 않는다면 초반 패널티를 나쁘지 않게 받은 채로 시작할 수 있을 것 같다고 생각했습니다. 비슷한 상황이 ICPC 팀에서 있었다면 2명 이상이 디버깅에서 말리는 상황을 걱정했겠지만, 이번 팀은 3오렌지이고 나머지 두 명 모두 저보다 구현 경험이나 푼 문제 수가 훨씬 많기 때문에 걱정하지 않았습니다.
iccodly가 A번을 제출했지만 틀렸습니다. (44분) 코드를 프린트하고 머신을 G로 넘겼습니다.- 저는 C의 풀이를 냈다고 주장했습니다. 남은 문제를 최대한 많이 보기로 했습니다.
iccodly가 아마도 A를 수정할 수 있다고 했습니다.- 저는 F가 컨벡스헐 딸깍이라고 생각했고, 이걸
iccodly에게 주장했습니다. 맞는 것 같다고 했습니다. denniskim이 G의 예제가 안 나오며 풀이가 틀린 것 같다고 했습니다. 머신을iccodly의 A로 넘겼습니다. 저는 이때쯤 L번을 잡고 있었던 것 같습니다.iccodly가 A를 수정해 제출했고 틀렸습니다. (87분) 코드를 프린트하고 제가 머신을 잡았습니다.- 슬슬 구현 큐가 밀리고 있었고, 크게 우려하지 않았던 상황이 최악의 형태로 현실이 되었습니다. A와 G가 매우 많이 풀린 상황에서 팀원 두 명이 모두 맞왜틀을 시전하고 있었고, 정작 저는 구현 큐에 문제가 3개 있어서 디버깅에 붙어주기 쉽지 않은 상황이었습니다.
- 원래 두 명이 디버깅에서 말린 상황에서는 나머지 한 명이 들고 있는 문제를 버리고 디버깅을 구원해주는 게 좋다고 이전 대회에서 생각했지만, 이번에는 제가 들고 있는 풀이가 너무 많(고 구현이 많이 어려워 보이는 문제는 없)아 이걸 밀고 오는 것이 패널티 면에서 이득이라 결론내린 것 같습니다.
1:27~2:46
- 저는 C, F, K의 풀이를 들고 있었고, K를 먼저 구현했습니다.
- 제출했으나 틀렸습니다. (103분) 틀린 부분이 바로 보였고, 수정해서 다시 제출했고 맞았습니다. (105분) A와 G 모두 아직 모르겠다고 해서, C를 구현하기로 했습니다.
- 생각해보니까 C의 풀이가 완전하지 않은 것 같아서, F를 구현하기로 했습니다.
- F를 제출했으나 출력 초과를 받았습니다. (130분) 아직 A와 G를 못 고친다 해서 더 잡았습니다.
- 무언가를 고쳤고 맞았습니다. (134분)
- 이때쯤,
iccodly는 A를 보고 있었고 (denniskim과 같이 보기 시작한 시점이 언제인지는 모르겠습니다)denniskim은 G에 400줄짜리 풀이가 존재하나 이보다 더 쉽게 만들 수 없다며 포기하고 E를 잡아서 아마도 풀 수 있을 것이라 주장했던 것 같습니다.
- 이때쯤,
- 딱히 머신을 넘겨도 C보다 빠르게 해결될 만한 무언가가 없다고 생각한 저는, 일단 C의 풀이를 최대한 빠르게 찾아내서 풀기로 했습니다.
- 사실 앞에서 C의 풀이가 완전하지 않다고 생각했던 것은 가짜였고, 그래서 그냥 바로 구현을 시작했습니다.
- 제가 C를 제출해서 RE를 받았습니다. (157분)
- 부호를 반대로 쓴 부분이 있었고, 수정해서 맞았습니다. (166분)
- 슬슬 A와 G가 안 풀린 것이 매우 이상한 상황이 되었습니다. 패널티가 이미 너무 높고(저도 이 80분 동안 3문제를 풀면서 패널티를 3번 쌓았고요) 승부는 솔브수로 봐야 하기 때문에 - 적어도 7솔, 이상적으로는 8솔 이상을 해야 되겠다고 생각했습니다 - 아직까지도
denniskim과iccodly가 A와 G를 해결하지 못했다면 둘의 코드를 갈아엎고 제가 풀이부터 다시 만들어 구현해 맞아야 할 수도 있겠다는 생각까지 했습니다.
- 슬슬 A와 G가 안 풀린 것이 매우 이상한 상황이 되었습니다. 패널티가 이미 너무 높고(저도 이 80분 동안 3문제를 풀면서 패널티를 3번 쌓았고요) 승부는 솔브수로 봐야 하기 때문에 - 적어도 7솔, 이상적으로는 8솔 이상을 해야 되겠다고 생각했습니다 - 아직까지도
2:46~4:00?
iccodly가 A번에서 틀린 것을 못 찾겠다 주장했습니다. 코드를 읽었고,iccodly와denniskim이 어떤 다른 문제를 보는 동안 모듈러 연산을 빼먹은 곳을 찾아서 수정해서 제출했더니 맞았습니다. (176분)- 대회가 끝나고
iccodly를 숙청하기로 마음먹었습니다.
- 대회가 끝나고
denniskim이 결국 G를 버려야겠다고 주장했고, 제가 받아서 읽었습니다. 쉽지 않은 문제인 것 같다고 생각했습니다.- 저는
denniskim에게 대략적인 풀이를 들었고, 이게 정해는 아닐 것 같다고 생각했습니다. - 저는
denniskim에게 어떠한 자명한 관찰을 이야기했고,denniskim은 깨달음을 얻고(???) 풀이 비슷한 것을 뱉었습니다. - 제가 풀이를 약간 수정했고,
denniskim은 자신이 바보라며 G를 구현하러 갔습니다. 대회가 끝나고denniskim도 숙청하기로 마음먹었습니다.- 자, 이제 6솔까지는 (아마도) 커버했습니다. 솔브수로 비비면 된다는 생각을 가지고 있었습니다.
iccodly와 L에 대해 얘기하다가, 그냥 어려운 문제라고 결론지었던 것 같습니다.iccodly가 J의 풀이를 낼 수 있을 것 같다고 대충 이 때쯤 주장했던 것 같습니다. 넘기고 D와 H를 봤습니다.denniskim이 G를 제출했으나 틀렸습니다. (220분) 고쳐보겠다 해서 일단 기다렸던 것 같습니다.denniskim이 G를 제출했으나 틀렸습니다. (223분) 제가 붙어서 코드를 읽어봤던 것 같습니다.denniskim이 갑자기 깨달음을 얻고 G를 제출해서 맞았습니다. (227분)- 자, 이제 진짜로 6솔까지 커버했습니다.
iccodly가 J를 해결해준다면 7솔,denniskim이 E의 풀이를 내거나 마지막 1시간동안 저와denniskim이 풀이를 하나 더 내면 8솔입니다.
- 자, 이제 진짜로 6솔까지 커버했습니다.
denniskim과 I를 봤습니다. 생각보다 그렇게 문제가 복잡하지 않았습니다.- 그냥 지금까지 조금밖에 안 풀린 게 이상한 구현 문제라 생각했습니다. 사실 문제를 잘못 읽었습니다.
- 그럼에도 문제가 그렇게 어렵지 않은 것 같다고 생각했습니다.
denniskim이 구현하기 위해 머신을 가져갔고, 1시간 정도가 남아있는 시점이었기에 풀 수 있을 것 같았습니다.- 8솔으로 갈 준비가 되었습니다. 만약 대회 초반처럼 두 명이 동시에 말리지 않는다면 적어도 7솔은 바라볼 수 있을 것 같습니다. 물론 패널티 관리가 매우 안 되었으므로, 이상적으로는 두 문제를 모두 풀어 8솔을 해야 합니다.
4:00?~5:01
- 그와 (거의) 동시에, 각성한
iccodly가 J의 구체화된 풀이를 가지고 나타났습니다. 거의 다 만들어진 풀이었고, 설명을 열심히 들었고, 80% 정도 이해했는데 방향성이 너무 정해일 것 같다고 생각해서 I가 끝나는 대로 갖다 풀라고 했습니다. denniskim이 I의 예제가 안 나온다며 코드를 프린트하고 머신을 놓았습니다.iccodly에게 머신을 전달하고 바로denniskim과 코드를 봤습니다. 풀이가 간단한 것에 비해 구현하면 생각보다 복잡한 것 같았습니다.iccodly가 J의 예제가 안 나온다며 코드를 프린트하고 머신을 놓았습니다.denniskim에게 다시 머신을 전달하고,iccodly와 프린트한 코드를 읽었습니다. 몇 가지 틀린 부분을 찾았습니다.denniskim이 I번에 제출했으나 틀렸습니다. (279분)denniskim이 I번에 제출했으나 틀렸습니다. (283분)- 머신을 넘겨서
iccodly가 디버깅을 통해 찾은 내용을 수정했으나 예제가 나오지 않았습니다. (약 287분) - 그동안 저는
denniskim과 코드를 디버깅했고, 중대한 오류를 하나 찾았습니다. (약 292분) - 이것을 수정했습니다. (약 299분 15초)
- 백준의 제출창에 들어갔습니다. (약 299분 40초)
- 클라우드플레어가 도는 것을 기다렸습니다. (약 300분 3초)
- 사실 코드는 컴파일이 안 되는 코드였습니다.
denniskim이 이를 수정했습니다. (약 300분 45초) - 그 코드가 예제가 도는 것을 확인했습니다. (약 301분)
대회 이후
iccodly가 J의 코드를 GPT에 돌렸고, 틀린 부분을 알 수 있었습니다.
:gal::qbd::bbak:
스코어보드를 깠습니다. 중나정의 부분집합 2인팀인 Just Use CR에서 우승을 차지했습니다. 외에, 1인팀으로 수상한 韩国小南娘과 예선 때부터 미친 퍼포먼스를 보여주고 계시는 SEVERANCE가 기억에 남습니다. 저희 팀은 개좃망했기 때문에 이 부분은 할 얘기가 없네요.
그리고 팀원들과 Rock kokkiri Paper 팀을 비롯한 카이스트 분들과 쌀(단백질으로 이루어진)을 맛있게 먹고 집에 왔습니다.
분석
- 이번 대회는 팀원 3명의 역량이 꽤나 비슷하다고 생각했고, (3명 다 현레와 맥레가 오렌지입니다. 다만 저는
denniskim이 최소 2400이라고 주장합니다.) 그래서 이렇게 극단적으로 제가 극후반 이전을 끌고 가는 그림을 상상하지 못했습니다. - 사실 이런 상황이 올 수도 있겠다는 생각은 대회 시작으로부터 45분 시점에 했습니다; 대충 제가 첫 문제 이후 슬슬 두 번째 풀이를 만들어내고 있는 상황에서, 한 명이 말리고 머신을 다른 사람으로 옮기는 시점이었는데, 그런 상황에서 두 명이 모두 말리고 저만 풀이를 두 개 이상 쌓아놓고 있는 상황이 케쌀헌 초반 팀연습에서는 많이 일어났습니다. 그런 상황이 이 조합에서 안 일어날 것이라 생각한 것이 실책이려나요?
- 그 상황에서 제가 두 번째 풀이를 구현하기 시작하는 시점이 90분까지로 밀렸다는 점이 큰 실책이었고, 그 실책의 결과물로 제가 든 문제를 다 풀고 나니 푼 문제는 저만 4개, 대회 시간은 절반이 채 남지 않은 상황, 그리고 나머지 둘은 반죽음 상태였습니다. 머신을 잘 뺏었어야 하나 싶은 생각이 듭니다.
- 실제로, A와 G 모두 정해보다
iccodly와denniskim이 만든 솔루션이 구현하기도 어렵고 더 복잡했습니다. 초반에 다른 팀들이 쉽게 푼 문제를 너무 어렵게 잡고 있다는 사실을 깨닫지 못한 잘못, 그 상태에서 어려운 풀이를 밀고 나간 잘못, 그런 상황을 무시하고 큐에 문제를 쌓기만 한 잘못 등이 섞여서 대충 큰 똥이 만들어진 것 같습니다. - 이걸 기반으로 케쌀헌의 팀연습에서 가져갈 만한 교훈은, 남이 (슥보상) 안 어려워야 하는 모르는 문제의 구현을 오래 잡고 있으면 일단 갈을 박고 보자는 점인 것 같습니다. 실제로 케쌀헌은 팀원별 초중반 속도가 많이 언밸런스한 팀이고, 그래서 이번 셋과 비슷한 형태로 초반의 시간을 유의미하게 많이 버린 팀연습이 있었기 때문입니다. 다만 얼마나 열심히 갈을 박아야 할지 - 즉 제가 풀이를 갈아엎는데 시간을 투자하거나 머신을 뺏어서 구현머신이 되는 것 같은 ‘극단적인’ 선택을 언제 해야 할지는 아직 잘 모르겠습니다.
- 그 외에, 극후반부에 페어 브레인스토밍과 페어 디버깅을 매우 활동적으로 했으며 이것이 실제로 유의미한 도움이 되었다고 생각하기에 (물론 결론적으로 둘 다 못 풀고 6솔로 끝났으므로 유의미하지 않다고 반박하면 제가 할 말은 없지만), 이 점은 긍정적입니다. 이것이 케쌀헌에서 잘 이어질 수 있을지는 잘 모르겠습니다.
- 이 부분에서 8솔으로 갈 준비를 다 했지만 6솔으로 대회를 마무리한 점은, 제가 무슨 짓을 했어도 이를 개선할 수 있었을 것 같지 않아서 (I는 구현이 간단하지 않다고 느꼈고, J는 애초에 제가 풀이를 100% 이해하지 못한 채로
iccodly가 구현에 돌입했고요) 피드백이 없습니다. 아쉬운 거죠 뭐.
중간고사와 중간고사 대체과제 시즌, 대수경이 모두 끝났습니다. 글을 올리는 시점 기준으로 리저널까지 3주가 채 남지 않았으며, 현실적으로 남은 풀타임 팀연습 세션은 5회 정도입니다. 와중에 리저널이 7개가 되어버리는 바람에, (지금 이걸 논하기는 이르지만 체감상) 서울에서 아챔에 가기 위해서는 적어도 우선순위 10위 (작년 기준 18위 언저리) 정도를 해야 합니다.
감사하게도 Endgame에서 5회 세션을 모두 도실 예정인 듯합니다. 그중 온사이트로 돌 수 있는 셋은 같이 돌고, 외에 온라인으로 따로 도는 셋은 일부만 돌고 나머지 세션에는 서울 셋을 돌 생각입니다.
얼마 안 남았습니다. 화이팅해봅시다.