UCPC가 끝났으니, 이번 팀연습부터는 ICPC 대비하는 데에 초점을 맞추기로 했습니다. UCPC와 ICPC 모두 팀 대회지만 대비하는데에 있어 약간의 차이가 있는데, 큰 부분만 따지면 다음과 같습니다.
- ICPC는 UCPC와 달리 컴퓨터를 한 대만 사용할 수 있습니다.
- 따라서 3명이 한 컴퓨터를 사용하는 연습을 해야합니다.
- 이 과정에서 누구 컴퓨터를 사용할지, 어떤 ide를 사용할지 등에 대해 팀원간의 합의가 필요합니다.
- ICPC는 UCPC와 달리 검색이 허용되지 않습니다. (cppreference정도는 허용)
- 대신 25장 이내의 팀노트(일종의 컨닝페이퍼)를 사용할 수 있으므로, 팀노트 관리가 필요합니다.
- ICPC는 UCPC와 달리 대부분의 문제가 영어로 제공됩니다.
- 저희 팀에 다른 팀에 비해 언어 장벽이 조금 있는 편이기 때문에 다른 부분 못지 않게 치명적입니다.
- 저희 팀에 다른 팀에 비해 언어 장벽이 조금 있는 편이기 때문에 다른 부분 못지 않게 치명적입니다.
이중에서도 오늘 팀연습은 1번 항목, 즉 한 대의 컴퓨터로 문제를 푸는 데에 적응하는 것을 목적으로 진행했습니다. 대회 셋은 해외 리저널 셋 중 난이도 분포가 적당해 보이는 것을 고르기로 했는데, BAPC 2020이 난이도 분포가 적당해 보여서 채택되었습니다. 다만, 스터디룸을 정확히 5시간을 예약했고, 연습 시작 전에 몇 가지를 확인해 봐야 했기 때문에(프린터, 키보드 상태 등), 5시간 셋이지만 4시간만 뛰기로 했습니다.
시작하자마자 kyaryunha는 A, jame0313님은 B, 그리고 저는 C를 잡았습니다. C는 딱 봤을때 쉬운 그리디겠다 싶어서 바로 코딩에 들어갔고, 보기좋게 WA를 2번 받았습니다. 왜 틀렸는지 고민하다가 jame0313님이 B를 코딩하겠다고 해서 컴퓨터를 잠깐 넘겨줬는데, 얼마 안지나서 바로 반례가 생각났습니다. 모든 참가자의 페널티가 0일 경우에 대한 예외처리가 필요한데 안했더군요.. 이 부분을 고쳤더니 드디어 AC를 받았습니다.
C solved (by artichoke42, 21min, 제출 3회)
C를 풀고 나서 D, I 등 다른 문제를 읽던 도중 kyaryunha가 H 해석이 잘 안된다고 해서 해석을 도와줬습니다. 그런데 읽어보니 그냥 그대로 출력하기와 다를 게 없는 문제더군요. 그래서 바로 코딩에 들어갔고, 곧 AC를 받았습니다. 추가로, 제가 H 코딩 들어가기 직전에 jame0313님이 B도 AC를 받은 것으로 보입니다.
B solved (by jame0313, 37min, 제출 1회)
H solved (by artichoke42, 43min, 제출 1회)
H를 푼 뒤에는 J를 잡았습니다. 그런데 문제를 읽고 보니 이것도 단순 사칙연산으로 \( O( \sqrt{c+e+m}) \) 에 풀릴 것 같아서 코딩에 들어갔고, 곧 AC를 받았습니다.
J solved (by artichoke42, 58min, 제출 1회)
4솔을 분기점으로, 저를 포함한 팀원들이 단체로 뇌절하기 시작했습니다. 저는 J를 푼 이후로 jame0313님과 함께 G를 잡았고, kyaryunha는 E를 잡았습니다. G는 발전기를 모두 켜놓은 상태에서 mst를 돌려되, 발전기가 켜져있는 group끼리 간선으로 연결되게 될 경우, 발전기 하나를 제거하거나 간선을 연결하지 않는 방식으로 코드를 짜서 제출했으나, WA를 받았습니다.
한편 제가 풀이를 듣고 jame0313님은 발전기를 없애고 간선 추가하는거랑 간선 추가하기만 하는거랑 cost가 달라서 mst가 성립 안하는 거 같다고 하셨는데, 듣고 보니 그럴듯해서, 해당 풀이를 폐기했습니다. 그런데 끝나고 보니 제 풀이에서 한 줄만 고치면 통과되네요 (맞는 풀인지는 모르겠습니다.)
G가 답이 없다고 판단했는지 jame0313님은 G를 손절하고 F로 가셨고, 저는 G를 계속 잡았습니다. 하지만 AC를 받을 수 있는 풀이를 폐기해놓은 채로 문제를 풀 리는 만무했고 WA 두 번과 RTE 한 번을 더 쌓을 뿐이었습니다. 결국 저도 G를 손절하고, I로 넘어갔습니다.
I번은 처음 봤을때는 그래프 문제인가? 싶었는데 그냥 처음 1/4, 그다음 1/4, 나머지 순서대로 정렬하면 될 것 같아보였고, n이 항상 4로 나누어 떨어진다는 제한때문에 해당 풀이에 확신을 가지고 있었습니다. 당시 jame0313님이 F를 잡고 있는 상황이었어서, E 한 번 틀리고 막혀있었던 kyaryunha에게 I 풀이를 설명하고, 코딩을 부탁해놓고, F 풀이를 듣고 디버깅을 도와드렸습니다. 그런데 지금 생각하면 I 코딩은 직접할 걸 그랬네요. kyaryunha에게 구현을 떠넘긴 꼴이 돼버렸어요..
아무튼 jame0313님이 F를 구현하다가 막히면 kyaryunha가 I를 구현하고, kyaryunha가 막히면 jame0313님이 다시 코드를 짜는 방식으로 반복하다가, jame0313님이 드디어 다섯 번째 AC를 받았습니다.
F solved (by jame0313, 221min, 제출 2회)
남은 시간동안 I 하나라도 건지려 했는데, 1WA 하나 쌓고 예제 답도 안나오는 채로 연습이 끝나버렸습니다. 1시간만 더 있었으면 I도 풀고 E도 디버깅하면 풀 수 있었을 거 같은데 아쉽네요.
정리
처음 1시간까지는 괜찮았는데, 이후 3시간동안 제대로 말려서 아쉬운 결과가 나왔네요.. 원래대로 5시간 뛰었으면 7솔까진 가능했을 것 같긴 하지만, 그래도 (특히 G때문에) 아쉽긴 마찬가지인 것 같습니다. 팀원들 전체가(특히 제가) 무지성 제출을 하는 바람에 페널티가 많이 쌓인것도 좀 그렇네요..
문제풀이 외적으로 있었던 문제를 짚어보자면, 대회 규정상 문제 프린트를 3분 이내에 해야 할텐데, 오늘 문제 출력 도중에 프린터 종이 부족 이슈가 있어서 출력하는데 4분이 걸려버렸습니다. 앞으로 팀연습 할때마다 프린터 종이 상황 체크를 꼭 해야한다는 교훈을 얻었습니다.
그리고 컴퓨터를 3대에서 1대로 줄이면서 생기는 병목 현상은 별로 없었던 것 같긴 하지만, 페어 코딩/디버깅이 잘 안되는 것 같았습니다. E, F, G, I 네 문제 다 코딩할때 지켜보는 사람이 있었음에도 버그를 잡아내질 못했네요.. 다른 사람(특히 팀원) 코드 좀 읽든가 해야겠습니다.