본문 바로가기

Contest/ICPC

2023 ICPC 후기

 

Spotboard

Spotboard from algospot.com, wookayin and Being CSUS Programming Contest System Icons from FatCow

static.icpckorea.net

 

2023 ICPC에 red1108, ncy09와 함께 NoPractice라는 팀으로 참가했다. 팀은 SNUPS + $\alpha$ 를 통해 구성되었고, 팀명은 기만의 의미로 내가 정했다. 실제로 연습을 안 하지는 않았지만, 팀원들의 스케줄 이슈로 예선 때 1번, 본선 때 2번을 모두 3시간 셋으로 돌았다. 필자가 대학에 와서 PS를 소홀히 하긴 했으나, 두 팀원 모두 실력 있는 형들이어서 누가 되지 않게 열심히 준비했다. 폼을 끌어올리기 위해 예선 전에는 플랜디, 본선 전에는 다랜디로 연습했고 효과가 있었는지는 잘 모르겠다.

 

결과는 예선 15등, 본선 14등(대만 팀 제외 13등)으로 등수를 조금 올려서 수상권에 드는 데에 성공했다. 본선 결과가 아슬아슬한 상황이었어서 슼보가 공개되기 전까지 엄청 마음 졸이고 있었다. 내가 못했기에 특히나 더... 다행히 8솔브 팀이 예상보다 훨씬 적게 나왔고 페널티 관리가 어떻게 잘 되면서 수상권을 지켜냈다. 팀원 모두의 첫 ICPC 입상이었기에 정말 기뻤고 안도했다. 다만 내가 중간만 갔어도 최대 은상까지 가능한 상황이 연출되어서 아쉬움이 크게 남는다..

 

예선은 이제 와서 쓰자니 기억이 거의 증발했다. 3시간 대회라 막 우당탕탕 진행되었고 남들 다 푸는 6문제를 크게 막힘 없이 풀어냈더니 안정적으로 진출권에 들었던 것 같다. 특이사항은 J에서 관찰을 통한 최적화가 필요한 부분을 그냥 시복 터지는 깡 DP로 뚫었다는 점이고, 대회가 끝나고 나서야 정해가 아님을 깨달았다.

 

본선에서 우리의 전략은 나와 red가 초중반 문제들을 빠르게 미는 동안 ncy가 어려운 문제를 충분히 고민하는 것이었다. 그래서 초반에 내가 쉬워 보이는 D를 건네받고 바로 코딩에 들어갔다. 스택 두 개를 잘 운용하면서 여러 예외 케이스들을 처리하는 코드였는데 왜인지 엄청 이상한 출력을 뱉었다. 그래서 일단 프린트하고 디버깅 시작... 큐가 밀린 I와 G를 각각 ncy와 red가 해결하는 동안 나는 틈틈이 디버깅에 성공했다며 머신을 뺏고 바뀌지 않는 결과에 좌절하며 돌아갔다. 코드에는 여러 문제가 있었는데, 하나는 코딩 중간에 큰 if문 두 개의 순서를 바꾸었는데 그 내부가 완벽히 바뀌지 않았었고 다른 하나는 스택으로 분수를 관리하면서 연산 순서를 지키지 못했다. 이를 다 고친 게 아마 한 시간이 넘는 시점이었던 것 같고, 세 문제를 페널티 없이 밀었는데도 순위가 낮아서 당황했다.

 

이때쯤 red는 E의 풀이를 정리하는 중이었고, ncy는 F를 풀고 있었다. 그래서 남은 문제 중 그나마 많이 풀린 B를 보러 갔다. 문제는 대충 배열에 이상한 짓을 해서 새로운 배열을 만드는데, 이를 역으로 해결해야 했다. 처음에는 그냥 나이브하게 하면 되는 줄 알고 머신 뺏어서 짰는데 예제도 안 나왔다. 보니까 배열에서 삭제하는 것 때문에 인덱스가 이상해져서 pbds를 써야만 했다. red는 E를 다 짜고 디버깅, ncy는 F에서 맞왜틀, 나는 B에서 pbds 뇌절이 병렬로 진행되고 있는 상황이었다.

 

ncy가 F를 임시 손절하고 많이 풀린 H를 보러 갔다. 금방 제곱 풀이를 내오더니 제한이 애매해서 고민하길래 맞을 것 같다고 했고, 재귀로 TLE를 한 번 받은 뒤 비재귀로 고쳐서 맞았다 아마. 나도 pbds의 타입을 int로 했다가 pair로 했다가 뇌절하다가 갑자기 예제가 나오길래 제출했고, 맞았다. 그 과정에서 머신을 또 자주 뺏었다. ncy는 다시 F, 나는 풀이가 있었던 J를 보러 갔다.

 

F가 dnc opt 꼴이라는 얘기가 나왔는데 슼보를 보니 그걸 딱 빨리 풀었을 것 같은 팀들만 풀어서 긍정해 줬다. E, F를 둘이 번갈아가며 코딩하는 동안 나는 J의 풀이를 구체화했다. J는 초반부터 내가 digit dp 풀이를 생각해 뒀지만, 구현 경험도 적을뿐더러 더러워 보였기에 계속 미루고 있었다. E, F가 차례로 풀리고 한 시간 반 정도 남은 상황에서 내가 J를 풀고 8솔을 달성한다면 수상권에 안정적으로 들 수 있었다. 그래서 절대 실수하지 않는다는 생각으로 차분하게 코딩했고, 한 시간 정도를 들여 완성했다. 초반에 $k$를 소인수분해하기 위해 폴라드 로를 짜다가 red한테 제지당한 거하고, 나머지를 출력하라는 부분을 놓친 것 빼고는 완벽하다고 생각했다. 그런데 WA 두 번, RTE 한 번을 받았고, ncy와 코드를 보면서 배열 크기를 잘못 잡은 것과 코너 케이스를 하나 놓친 부분을 보완했다. 그래도 틀렸는데, 그 뒤로 고치지 못했다. 한편 내가 J를 코딩하는 동안 red와 ncy가 L의 풀이를 내서 J의 디버깅과 함께 코딩을 진행했다. 그러나 L은 세그 폴트가 뜨면서 시간 부족으로 고치지 못하고 끝났다.ㅎ

 

예상과는 달리 코딩 시간이 매우 부족해서 머신 배정을 더 효율적으로 해야 했음을 느꼈다. 아무래도 내가 D와 B에서 말리지 않았다면 J와 L을 디버깅할 시간을 확보할 수 있지 않았을까, 하는 아쉬움이 크다. 또한, J를 디버깅할 때 나이브 코드를 짜서 활용할 생각을 하지 못한 게 후회된다. 시간적 여유도 있었고, 훨씬 효과적이었을 것 같은데 말이다. 아무튼 짧지 않은 시간 동안 함께 해준 형들에게 고맙고, 잘해주어서 더욱 고맙고, 잘해주지 못해서 미안하다. 내년엔 형들이 높은 확률로 군대에 가서 새로운 팀을 구해야 한다. 그땐 더 잘할 수 있겠지