Computer Science/Problem Solving

UCPC 2024 예선/본선 후기

리유나 2024. 8. 7. 10:00

오래간만입니다. 리유나입니다.

 

싱가포르 교환학생도 잘 다녀오고, 어찌저찌 우여곡절 끝에 올해 ICPC조차도 문송송으로 나가는 것이 확정이 되어, 예행 연습을 겸하여 전국 대학생 프로그래밍 대회 동아리 연합 주최 대회인 UCPC에 참여했습니다.

 

결론부터 말씀드리자면 본선 전체 7위로 4등상을 수상했습니다! ICPC와는 달리 다른 학교 학생과도 팀을 만들 수 있고, ICPC는 한참 전에 은퇴한 대학원생들도 참여 가능하다는 점 때문에 어려운 승부가 되는 곳이 UCPC인데, 이곳에서 괄목할만한 성과를 내게 되어 기쁩니다!

 

하지만 이건 어디까지나 팀원들의 성과이며, 제 개인적으로는 반성할 점이 적지 않아서 더욱 노력해야겠다고 결심하게 된 대회기도 했습니다. ㅎㅎ

 

 

아래는 대회 진행 타임라인을 정리해봤습니다!

0. 팀 구성

몇달 전에 뭔가 우여곡절이 있던 끝에, 문송송이 결국 3년 연속으로 유지되는 것으로 결정되었습니다..! 사실 나이도 제법 들었고 이번이 졸업(진짜로)학기인지라 슬슬 은퇴할 시기인가 하고 생각하고 있었는데, 마지막 기회를 얻었으니만큼 이번에는 저희 팀 모두의 크나큰 염원이던 월드 파이널 티켓과, 조금 더 욕심 부려서는 우승까지도 노려보고 싶었고, 이는 비단 저뿐만이 아니라 2년 연속 문턱에서 미끄러떨어진 팀원들 모두의 염원이기도 했습니다.

 

어찌되었건 간에, 3년간 합을 맞춰온 팀으로서, 그리고 사실 저를 제외한 나머지 두명은 고등학교 3년을 포함해서 무려 6년을 봐왔으니만큼 이제 팀원들은 웬만큼 서로의 장단점에 대해 잘 파악하고 있고 팀연습의 방향성이나 전략은 2년 전 첫 대회로 UCPC를 나갔을 때와는 비교도 안될 정도로 잘 맞아떨어지고 있었다고 생각합니다.

 

1. UCPC란?

UCPC는 전국 대학생 프로그래밍 대회 동아리 연합이 주최하는 여름 대회로, ICPC 스타일 그대로 진행되어 ICPC를 준비하는 팀원들을 위해서는 가장 적합한 예비 대회라고 할 수 있습니다. 더불어 문제 난이도나 퀄리티도 ICPC 이상으로 괜찮고, 참가하는 팀들의 수준 또한 오히려 본 대회인 ICPC 이상으로 높아서 제법 고전하는 대회이기도 합니다.

 

문송송은 2022년에 팀구성 직후 UCPC를 나갔던 적이 있지만, 그때는 본선에서 팀워크가 잘 맞지 않았고, 문제 스타일 등등 여러 이슈로 인해 아쉬운 성적을 내고 돌아갔던 쓰라린 기억이 있습니다.

 

이후 2023년에는 문송송으로 출전하지 않았고, 2024년 올해는 다시 문송송으로 UCPC를 출전하게 되었습니다!

 

2. 팀 연습

사실 많이 하지는 않았습니다. BAPC 한번 CERC 한번 돌렸던 게 고작이네요. 와중에 전반기에는 제가 교환학생을 다녀왔고, 이후에는 문이 본가에 가있어서, 3인 모두 오프라인으로 모여서 연습은 올해 들어서 한번도 해본 적이 없었던 게 역시 아쉬웠습니다.

 

3. 인터넷 예선

스코어보드는 어디서 보는지 모르겠고... 무난하게  치뤘습니다. 제가 빠르게 A를 밀고 D를 밀...려고 했으나 구현이 뭔가 꼬였고, K를 밀고 H를 밀고, 2시간쯤 지나서 '어차피 8솔이면 무조건 본선 간다'는 주장 하에 던지고 가서(...)20등인가 했던 기억이 납니다.

 

4. 본선

본선 타임라인을 기억나는 대로 복원해보자면... 다음과 같습니다.

 

(0분) 시작과 함께 제가 맨뒤를 보았습니다. 러시안 회전초밥은 좀 에바인 문자열, K는 제가 풀어야 하는 수학문제(라고 생각했던 것이 큰 화근이 되었습니다...)나머지는 적당히 다른 팀원들이 풀 수 있을만한 문제라는 판단이 들어서, 저는 K를 붙잡고 나머지 팀원들에게 다른 문제들을 요리조리 던졌습니다.

 

(23분) 다들 D를 풀었길래, 저희도 D를 풀었습니다.

 

(47분) J가 처음에는 정말 그냥 하면 되는 문제일 거라고 mhy가 판단했다가 패널티를 조금 쌓고... 약간의 자료구조를 끼얹어서 정답을 받았습니다. 이어서 아마 songC가 L 정해도 받았던 걸로 기억합니다. 이 시점 즈음에서 저는 songC에게 "A 구성적인데 풀어봐라"는 제안을 받고 요리조리 시도를 해보던 참이었습니다.

 

(??분) A 풀이가 나와서 짰지만 뭔가 구현이 크게 꼬여서 2틀을 적립했습니다....

 

(96분) songC였나?가 M을 풀었습니다. 패널티를 구질구질하게 쌓던 저희팀 치고 패널티 없이 바로 통과했습니다.

 

(117분) 답답해서 보다못한 A를 풀이를 songC가 듣고 구현만 대신 하는 식으로 AC를 받았습니다. 죄책감이 엄청나진 상태로 저는 계속해서 K를 보면서, 중간중간 다른 팀원들의 러버덕이 되어주었습니다.

 

(139분) songC가 E를 AC 받았습니다.

 

(154분) mhy였나? 정확히 기억은 안나는데 C를 AC 받았습니다.

 

(178분) mhy가 팀노트를 정말로 열심히 끄적끄적 보고 머리를 싸매면서 2번의 WA 끝에 H를 AC 받았습니다.

 

저는 이 시점까지 계속해서 K를 비벼보고 있었고, 정말로 손으로 웬만한 경우들을 다 적어보면서 규칙을 찾아보려고 했으나 '이걸로 될 문제면 지금쯤 안 풀린게 말이 안된다'라는 논리 하에 반쯤 포기하고 있었습니다. 남은 문제들 중에서는 K 말고는 I와 F가 풀이가 나온 시점이었는데, F는 저도 풀이를 들어보니 아주 타당해서 실수만 안하고 구현하면 되겠다..하고 납득했고, I는 어차피 제가 이해하기 힘든 문자열 문제였습니다.(풀이는 정확히 나온 것 같다는 건 그래도 얼핏 알 수 있었습니다. 시간복잡도가 문제라 그렇지)

 

이후 songC가 F부터 짰고, 247분에 F를 AC 받았습니다. 그즈음 뒤로부터는 저도 사실상 K는 포기하고, 다같이 I 구현에 온 힘을 다했지만, 마지막까지 예제가 안 나오거나 오류가 나오거나 하는 고난 끝에 결국 구현을 실패하고 대회를 마무리했습니다. 프리즈 당시 7등이었는데, 그 직후에 AC 받고 그뒤로 아무 진전이 없었어서 역시 순위 예상은 힘들었습니다. 대회가 끝난 이후 다른 두 팀원들과 순위 예상을 해봤는데, mhy는 6등, songC는 7등, 저는 8등을 예상해서 뭔가 웃겼던 기억이 나네요.

 

5. 대회 후

 

K번의 생성 함수가 사실 생각보다 금방 나오는 식이라는 것을 깨닫고 약간 허탈했습니다. 제가 붙잡고 노가다라도 했으면 각이 안보이지는 않았을 식인 거 같은데, 뭐 다 끝난 뒤에 후회해봤자 남는 게 뭐가 있을까 싶지만서도요 ㅋㅋ... 제가 조합론이나 정수론 그 자체에 대한 이해도는 나쁘지 않지만, 생성함수가 나오는 문제에서는 정말로 손을 못 쓰는 경우가 많다는 것을 다시 한번 느끼는 대회가 되었습니다.

 

I를 결국 마지막까지 못했던 이유는 팀 노트의 suffix array에서 뭔가 고려를 안했던 게 있었던가? 하는 문제가 있었고 그 스노우볼이 꽤나 크게 굴렀었네요... 3년간 줄곧 느끼는 부분인데, 어려운 자료구조 문제는 역시 저보다는 다른 팀원 두 사람의 전문인 느낌이라고는 해도, 제가 이런 부분에서 기여도 자체가 0인 것은 역시나 마음이 아플 때가 많이 있어서 늘 정진해서 적어도 멀쩡한 러버덕으로서라도 기능할 수 있도록 노력을 많이 해야 할 것 같습니다. 역시 팀 연습을 꾸준히 하면서 보완해야 할 것 같아요.

 

나머지 문제들은... B는 songC가 풀이의 한 절반까지는 갔는데 가장 핵심적인 관찰을 놓쳤던 느낌이고, G는 손도 못댔네요 ㅋㅋ...

 

여러 세션 이후 스코어보드 개봉식이 있었고, 수많은 우여곡절(모 팀의 B 100회 제출 같은 일을 포함해서...)을 넘어 생각보다 나쁘지 않은 결과로 9솔 중 3등, 전체 7등을 하게 되었습니다! 사실 이 뒤의 비화가 하나 있는데, 저희 팀원들은 모두 노리고 있는 상품에 대해서 대회 직전에 이야기했었습니다. mhy는 "어차피 나 아이폰인데 4등상 버즈 있어봐야 어디에 쓰느냐, 차라리 5등상 마이크가 나으면 낫지 버즈를 받고 싶지는 않다"고 했고, 저는 (이름값도 해야하니)"나는 버즈가 예전부터 가지고 싶었다. 버즈를 꼭 가지고 싶다"고 해서 뭔가 미묘한 엇갈림이 있었는데, 정확히 4등 문열고 들어가면서 버즈를 받아서 mhy와 저의 희비가 아주 크게 엇갈리는 상황이 벌어졌습니다 ㅎㅎ...

 

 

6. 반성

대회 결과 자체는 꽤 좋았지만, 솔직히 제 개인적으로는 아쉬움이 크게 남는 대회였습니다. 팀 전체가 9솔브였는데, 제가 한문제, 나머지 팀원들이 각각 4문제씩 풀었네요... 변명아닌 변명을 하자면 초반에 밀만한 쉬운 문제가 제가 맡은 뒤편에서는 없었고, 그 뒤로는 다른 팀원들이 정말 차례차례 문제들을 이미 풀어둔 상태여서 제가 할 수 있는 게 딱히 없었다는 점이 있겠지만, 아무리 그렇다 한들 2솔도 아니고 1솔을 한 것은 역시 제 자신에게 많이 분했습니다.


반성을 해보자면, 웬만한 플레 문제까지는 저도 보면 '시간을 어느 정도 들이면' 풀이를 낼 수 있지만, 다른 팀원들 역시 그런데다 그 '시간'이 저에 비해서(특정 분야를 제외하고는)훨씬 짧다는 점을 꼽을 수 있을 것 같습니다. 적어도 다른 팀원들 발목을 잡는 일은 없도록 다양한 분야의 문제들을 눈에 익혀놔야 할 것 같습니다.


또 다른 문제라면, K를 잡지 못한 것입니다. 제가 정수론은 괜찮게 하고 조합론에는 상당히 강하지만 이상하게 '생성함수로 뭔가 우당탕탕 해서 FFT하는 문제'같은 건 거의 손을 못 대는 편이라는 걸 오늘 깨달았습니다. songC도 이 점을 지적해 주었고, 그래서 돌아간 뒤로 하루에 한두문제씩 생성함수 태그가 붙은 문제들을 풀고 있습니다.

7. 앞으로


뭐 더 적을 말이 있겠습니까? 저의 마지막 ICPC, 모든 것을 불태우고 진심으로 마주하여 정말 후회 없을 결과를 보여드리겠습니다. 제 약한 점을 잔뜩 드러낸 이번 대회였으니만큼 충분히 보완하고 와야죠.


그리고 대학원 입시에서 좋은 결과를 보여서 내년에도 다시 UCPC에 오고 싶네요!