카카오 코드 페스티벌 후기
뒤늦게 정리해보는 카카오 코드 페스티벌 후기.
솔직히 수상을 전혀 기대하지 않았는데 수상하고 상금 32만원도 받게 돼서 정말 기분이 좋았던 대회였다.
온라인 예선
본선 진출자를 겨우 64명 밖에 안 뽑는다고 해서 굉장히 긴장됐었다. 아래는 타임라인별 요약. 무려 6시간동안 진행된 대회라 풀면서 너무 힘들었다.
~ 03:28 Solve A
A번은 그냥 너무 간단한 구현이었어서 쉽게 맞췄다.
~ 14:47 B WA 1
B번도 쉽다고 생각했는데, WA를 받았다. 로직적으론 분명 잘못된 게 없다고 생각했고, 그래서 문제가 될만한 건 실수 오차 밖에 없을 것 같아서 실수 오차를 줄이는 방향으로 이리저리 고민을 했다.
~ 19:38 B WA 2
~ 27:46 B WA 3
몇 번 더 시도를 했음에도 불구하고 계속 WA를 받았고, 여기서 좀 멘탈이 나갔다. 그래서 잠깐 C를 읽고 왔는데, 대충 풀이를 생각하고 구현을 좀 하다가 내가 생각한 풀이에 빈틈이 많다는 걸 깨닫고(+C가 만만치 않은 문제라는 걸 깨닫고) 다시 B로 돌아 왔다.
~ 65:31 B WA 4
~ 69:05 Solve B
그리고 겨우 겨우 4번의 WA 끝에 AC. 최대한 정수로 값을 다 계산해놓고, 맨 마지막에만 나눗셈을 해서 실수 오차를 해결했다. 나중에 C++로는 O(N^3) 로직을 짜도 통과였다는 말을 듣고 굉장히 허탈했었다. 시도라도 한 번 해볼걸...
~ 141:26 D WA 1
B를 풀고 난 다음 C로 넘어가서 다시 좀 구현을 하다가, 이게 케이스 분석을 꽤 잘하고 정리를 잘 해서 구현을 해야 하는 문제라는 걸 깨달았다. 이런 유형의 문제에 내가 약하기도 하고, 자칫 구현이 말렸다간 대회 끝날 때까지 시간만 낭비하고 문제를 제대로 풀지 못할 것 같은 생각이 들어서 2~30분 정도 고민하다가 그냥 포기하고 D로 넘어갔다. 스코어보드를 보니 D를 푼 사람이 더 많았어서 이게 풀만할 것이라고 생각했다.
그리고 좀 고민하다가 D의 풀이를 찾아서, 그걸 구현하고 제출했다. 하지만 WA.
~ 143:21 D WA 2
~ 153:49 Solve D
몇 가지 자잘한 구현상의 실수가 있어서 고치고 AC.
~ 226:56 Solve E
D를 풀고 E 문제를 읽어 봤는데 전혀 감이 안 와서, 다시 C로 잠깐 넘어갔다가 이것도 풀 엄두가 안 나서(ㅋㅋ) 그냥 E에 올인하자 생각하고 열심히 풀이를 생각했다. 좀 더 고민하다 보니 옛날 옛적 성용님께 BOJ 슬랙에서 특강을 들었던 PBS를 적용할 수 있을 것 같다는 생각이 들었다. 그래서 그 유명한 PBS 연습 문제인 유성 문제를 찾아보았고, 다시 보니 트리를 구간으로 펴면 완전 똑같은 문제였다. 그래서 유성 문제 풀이를 살짝 응용해서 풀고 AC.
이 시점에서 스코어보드를 보니 본선 진출에 상당히 안정권이었고, 그래서 C는 그냥 GG하고 놀러갔다. 예상대로 38등으로 본선은 안정적으로 진출했다.
본선
고등학교를 졸업하고 오프라인 개인 대회는 처음이었기 때문에 꽤 떨리기도 했고 기대가 되기도 했고 그랬다. 하지만 리눅스 + 코드블록이라는 굉장히 익숙하지 않은 환경에서 대회를 치뤄야 한다는 점, 내 실력 자체가 상위 31명 안에 들만한 실력은 안 된다는 개인적인 생각 때문에 그냥 재밌게 문제나 풀고 오자는 마음가짐으로 대회에 임했다.
~00:00 시작하기 전
대회 시작전에 코드블록 세팅을 하는데, 어떻게 해도 인덴트 세팅이 내가 원한 형태로 되지 않았다. 다른 건 어떻게 다 수정했는데, 이상하게 중괄호를 열고 엔터를 치면 인덴트가 하나 더 들어간 상태에서 시작하는 세팅이 절대 적용되지 않았다. 중괄호 열고 엔터를 치면 다음 줄이 윗줄에 중괄호 있는 거랑 같은 인덴트에서 시작해서 탭을 꼭 한 번 눌러줘야 했는데, 이게 너무 거슬려서 고치고 싶었지만 결국 실패... 아직도 왜 그랬는지 이해가 안 간다 ㅠㅠ 로컬에서 코드블록 깔아서 세팅 연습해 봤을 땐 잘만 됐었는데...
근데 신기하게도 막상 대회 중에 코딩할 때는 하나도 신경이 안 쓰였다. 그냥 무의식 중에 저절로 탭이 눌러졌다 ㅋㅋ 이것 때문에 말리거나 하진 않아서 정말 다행.
~18:38 A WA 1
A번 부터 상당히 구현히 까다로운 문제였다. 어떻게 어떻게 다 구현해서 제출했는데, WA. 확률 계산을 해야하는데 케이스 중에 4명 중에 2명 뽑는 걸 나도 모르게 0.25로 적어서 한 번 WA.
~ 20:45 Solve A
다행히 그 틀린 부분을 빨리 찾아서 AC.
~ 45:12 B WA 1
B번이 내가 정말 약한 유형의 문제였다. 규칙을 잘 찾고 정리하기 + 적절한 증명이 필요한 문제였는데 대충 생각하고 짰다가 틀렸다. 안 좋은 습관인데 잘 고쳐지질 않는 것 같다.
~ 51:37 B WA 2
~ 57:27 B WA 3
로컬에서 몇 가지 테스트케이스를 더 넣어보고, 수정을 했는데 잘 동작하질 않았다. 여기서 멘탈이 나갔고, B를 더 잡고 있는 건 너무 손해일 것 같아서 바로 C번으로 넘어 갔다.
~ 69:04 C WA 1
C는 보자마자 풀이가 생각나서, 문제를 먼저 쭉 읽어볼 걸 하는 후회가 강하게 들었다. 그리고 빠르게 코딩해서 짰는데 런타임 에러. 배열 크기를 잘못 잡는 멍청한 실수여서 한숨이 나왔다.
~ 69:24 C WA 2
배열을 고쳤더니 이번엔 메모리 초과가 나왔다. 코드 상에서 메모리 초과가 나올 부분이 없는 것 같은데 메모리 초과가 나서 엄청 당황했다.
~ 72:34 C WA 3
~ 74:14 C WA 4
이리저리 메모리를 줄여봤는데 여전히 메모리 초과가 났고.. DFS로 짠 부분에 뭔가 문제가 있는 것 같아서 BFS로 고쳤다.
~ 78:59 Solve C
BFS로 고치니 바로 AC. 거기에 메모리 사용량도 적었고... 아마 뭔가 DFS로 짰을 때 잡지 못한 버그가 있었는데 BFS로 다시 짜면서 그 부분도 해결됐던 것 같다. 아무튼 C 풀이도 빨리 생각했고 한 번도 WA 안 받을만한 문제였는데 여기서도 WA를 너무 많이 받아서 패널티가 이미 글렀다는 생각을 했다.
~ 84:36 B WA 4
~ 92:36 Solve B
C를 풀고 다시 B로 돌아와서 생각해보니 금방 내 풀이의 잘못된 점을 깨달았다. 그래서 그 잘못된 점을 수정하고, 그 와중에 또 실수 한 번 해서 패널티를 +20하고 B까지 AC.
그리고 스코어보드를 봤는데, 의외로 3솔브를 한 사람이 많지 않아서 수상권 이내였다. 하지만 내가 패널티가 엄청 높았기 때문에 여기서 한 문제를 더 풀면 100% 수상이고 아니면 100% 수상 못한다라고 보고, 괜히 두 문제 집적거리지말고 그냥 D에 올인하기로 마음먹었다. 어차피 수상 기대를 안 하고 왔는데 수상 가능성이 보인거니 크게 집착할 필요 없다는 생각이 들어서. 결과적으로 좋은 선택이 된 것 같다.
~ 132:26 D WA 1
그리고 생각보다 꽤 빨리 D 풀이를 떠올렸다. 단순한 DFS로 충분히 풀 수 있을 거라는 확신이 들었고, 그래서 코드를 옮긴 다음 로컬에서 여러 가지 테스트 케이스를 만들어서 확인도 해 보았다. 이 과정에서 내가 실수한 부분을 꽤 많이 찾아서 고쳤다. 그리고 이건 진짜 제출하면 맞는다고 생각하고 냈는데, 시간 초과가 떴다 ㅠㅠ
~ 154:19 D WA 2
다시 코드를 쭉 살펴보니, 내가 잘못 구현한 부분이 있어서 실제 시간 복잡도가 내가 생각한 것보다 훨씬 크게 나올 수 있다는 것을 깨달았다. 그래서 그 부분을 고치고, 다시 제출. 하지만 여전히 시간 초과가 나왔다. 그리고 다시 코드를 열심히 살펴봤는데, 이젠 정말 시간 복잡도 상으로는 꼭 통과가 돼야만 할 것 같았고, 시간은 얼마 안 남아서 슬슬 똥줄이 타기 시작했다. 수상을 기대를 안 하긴 했지만 이것만 풀면 수상인게 눈에 보이고 풀이도 다 나왔고 맞아야 할 것 같은데 틀렸습니다도 아니고 시간초과가 나오니 더 마음이 조급해졌다.
여기서, 구현 편하게 하려고 map을 쓴 부분이 있었는데 이 부분이라도 배열로 고치면 logN은 떨어지니 속도가 꽤 빨라질 수 있겠다 싶어서 우선 이걸 고치자고 마음을 먹었다. 그리고 다 수정해서 로컬에서 최대 크기 랜덤 데이터로 기존에 짰던 거랑 성능을 비교해보니 대충 2배 이상 속도가 빨랐다. 이 시점에서 남은 시간이 10분 남짓했고, 그래서 이거 통과 안되면 진짜 그냥 GG쳐야겠다 생각하고 눈 딱 감고 제출했다.
~ 164:35 Solve D
그리고 다행히 AC. 5초 제한인데 3초가 넘게 나와서 아마 의도한 방법은 아니었을 것 같고, 거기에 덧붙여 내 비효율적인 구현 때문에 엄청 느리게 동작했던 것 같다.
아무튼 D 통과하고 15분 정도 시간이 남았는데, 아마 수상하지 않을까? 생각을 하면서 스코어보드를 한번 쭉 봤는데, 프리징된 상태에서 D 제출한 사람 엄청 많길래 어쩌면 수상 못할 수도 있겠다 싶어졌다. 그리고 E 문제를 읽어봤는데 풀 만하다 싶으면서 꽤 재밌어 보이는 문제였다. 좀 고민해볼까 하다가 별로 집중이 안돼서, EFGH 다 한 번씩 제출하는 장난질 한 번 한 다음에 그냥 멍 때리고 있다가 대회를 끝마쳤다.
끝나고 보니 예상대로 4솔브 중 압도적인 패널티를 자랑하며 23등으로 수상. 내가 생각했던 것보다 훨씬 좋은 성적이었어서 놀랐다. 정말 내 실력이 그 정도 돼서 상을 받았다기보단 좀 운이 좋았던 것 같고 진짜 전혀 기대를 안하고 가서 마음 편하게 쳤던게 더 도움이 됐던 것 같기도 하다.
아무튼 오프라인 대회 정말 재밌었고 문제도 좋아서 즐거운 대회였다. 오프라인 대회 또 나가고 싶다.