<

CP/대회 후기

2023 ICPC Seoul Regional(지역예선) 후기

leedongbin 2023. 10. 29. 17:55

329팀 중 49위로 본선 진출!

UCPC와 마찬가지로 3인 1팀인데, 팀원이었던 dudqk9696님이 지원 자격에 부합하지 않아서 이번에는 kimyh9797, jang010505, leedongbin(나) 세 명으로 팀을 구성했다.

대회 날짜가 10/21(토) 였는데, 이 다음 주에 중간고사 시험만 6과목 + 교내 대회 운영 + 외부 대회 검수라는 살인적인 일정으로 ICPC를 연습할 시간이 없었다.

그래도 학교에서 유일한 팀이었기에 (ii) 조건에서 유리했고, 웬만하면 붙는다는 마음으로 팀 연습 없이 대회 당일에 처음 만났다. 예비소집에서는 3문제 중 2문제를 풀었는데, 페널티 관리를 못 해서 대회 때 좀 더 신경 쓰기로 했다.


예선 진행

대회 시작 30분 전에 스터디룸에 입장했다. 노트북 자리까지 생각해서 4인실로 빌렸는데 엄청 넓었다. 새로 들어온 팀원 분이 python을 사용하셔서 간단히 IDE 세팅을 해주고, 이번에는 팀 노트 없이 해싱이나 세그먼트 트리 구현 방법 정도만 대충 외워줬다. 대회 시작하고 문제들을 인쇄하면서 스코어보드 첫 solve를 기다렸다. 

  • 0:13: (C AC by leedongbin) 제일 먼저 풀린 C번을 바로 잡았다. 공백을 포함하여 한 줄을 입력받는 방법이 잠깐 생각이 안 나서 뇌정지가 왔는데, 금방 떠올랐다.(scanf("%[^\n]",s);) 시작하자마자 팀 노트 안 뽑은 걸 후회할 뻔했다. 이 문제는 한국어로 번역이 돼 있었는데 D번 문제를 풀 때까지 모르고 있었다... 읽는 데 오래 걸렸다.

 

  • 0:25: (D AC by leedongbin) $n<10^{10}$범위의 회문수 개수는 숫자를 반 접는다고 생각해보면 $sqrt(10^{10}) * 2$ => 20만 개 이하이고(숫자의 길이가 홀수/짝수인 경우를 따로 고려해야 해서 x2), 모든 회문수를 직접 다 만들어서 답을 구해줬다. kimyh9797님이 G를 풀고 계셔서, 나는 K번으로 넘어갔다.

 

  • 0:44: (G TLE by kimyh9797) 기약분수를 전부 만들어 봤는데 약 750만개$({n^{2}}/{3})$정도 나왔다. 시간제한이 0.5초긴 하지만 상수 커팅이 유의미하게 돼 있는 것 같아서 $n^{2}log(n) (n<=5000)$ 풀이를 시도했는데 TLE를 받았다.  

 

  • 1:11: (K TLE*2, AC by leedongbin) $n^{2}log(n) (n<=3000)$ 풀이를 시도했는데 TLE를 받았다. 상수가 너무 커서 팀원 분들과 토론했는데, 어렵지 않게  $n^{2}$ 풀이가 나왔다. 혼자서도 충분히 생각할만한 방법이었는데 너무 급하게 코드를 짜려다가 페널티만 날린 것 같아 아까웠다. G 풀이에 더 진전이 없어서 내가 G를 보기로 하고, kimyh9797님이 다음으로 많이 풀린 I번을 잡았다.

 

  • 1:40: (I AC by kimyh9797) 문제를 읽자마자 스위핑을 떠올리셔서 AC를 받아주셨다. 이때부터 G만 풀어도 본선 진출은 확정일 것으로 생각했다. G를 같이 고민할지, 그다음으로 많이 풀린 J에 도전할지 고민하다가 일단 kimyh9797 님이 J를 읽었다.

 

  • 2:14: (G  TLE, WA by leedongbin) $n^{2}log(n) (n<=5000)$에서 상수를 줄여봤는데 실패했다. 44분에 제출했던 풀이는 $n^{2}log(n^{2})$이었고, 이번에 제출한 풀이는 $n^{2}log(n)$ 이었는데 그래 봤자 절반 차이일 뿐이었다.

 

  • 2:28: (J WA by kimyh9797) $n^3 (n<=1000)$풀이를 시도하셨는데 WA를 받았다. 나는 $n^{2}log(n) (n<=5000)$ 0.5초도 TLE인데  $n^{3} (n<=1000)$ 2초는 절대 안 될 것 같아서, 그냥 같이 G를 고민하자고 제안했는데 조금만 더 고민해보겠다고 하셨다. 나는 아예 J번 문제를 읽지도 않아서 몰랐는데, 대회가 끝나고 얘기해보니 $(n/3)^{3}$ 정도 풀이였다고 한다. 

 

  • ~3:00: G와 J에 무수한 WA와 TLE를 받다가 끝났다.

결과 / 후기

(2)번 조건을 만족하여 본선 진출!

4 solve 중에서도 상위권이라 무난하게 진출했지만, platinum 중하위권 문제까지는 다 풀고 올라가고 싶었는데 그러지 못했다.

G번 문제는 페리 수열에 대한 사전지식이 필요한 문제였는데, 수학 문제를 제일 좋아하면서 이걸 몰랐다는 게 많이 아쉬웠다. 심지어 G번의 모든 테스트 케이스가 C++의 'nth_element()' 내장 함수로 뚫렸다고 한다. 그럴 거면 시간제한 늘려주지...

아쉬움은 뒤로하고 마지막으로 피드백을 간단히 해보자면,

  1. 팀노트를 잘 활용해야겠다 : C번에서의 scanf("%[^\n]",s)같은 방법이나, 잘 사용하지 않는 string 함수 등을 떠올리다 괜히 시간을 날리면 안 된다. 그리고 G번을 풀 때 nth_element()는 아예 생각도 안 났는데, 팀 노트에 있었다면 몸 비틀기로 한 번쯤은 시도해봤을까 싶기도 하다.
  2. 마음이 너무 조급하다 : 집에서 혼자 백준 대회를 볼 때는 마음의 여유가 있어서 이런저런 시도들을 해보는데, UCPC나 ICPC에서는 시간적 압박과 팀이라는 부담감 때문에 처음 떠올린 풀이를 깔끔하게 버릴 생각을 잘 못하는 것 같다. 팀원을 좀 더 믿고 멘탈 관리를 잘 해야 한다.
  3. 대회 환경에 적응이 필요하다 : PC가 1대이기 때문에, 구현 속도나 실력에 따라 누가 PC를 사용할지, 그 동안 어떤 문제를 누가 잡고 있을지 전략을 잘 정해야 한다. 그리고 평소에 연습할 때도 대회처럼 알고리즘 태그와 난이도를 모두 가리고 하는 게 좋을 것 같다.

어쩌면 학번 제한으로 이번 ICPC가 마지막일 수 있기 때문에, 본선은 팀 연습도 하면서 열심히 준비해야겠다.