티스토리 뷰

생각

CODE FESTIVAL 2017 후기

구사과 2017. 12. 25. 15:31

온사이트 대회가 끝나고 후기를 쓴 경험이 많지 않다. 쓸 내용이 많은 것도 있고, 대회가 끝난 이후에는 항상 일정이 바빴기 때문이기도 하다. 이번에도 예외는 아니지만, 집에 가는 기차에서 짧게나마 경험담과 느낀 점을 적어보려고 한다. 는 개뿔… 글이 길어져서 한 달 뒤 태국 리저널 가는 비행기에서까지 후기를 쓰고 있다. 그리고 크리스마스에 마감.

Qualification

상식적으로 앳코더 대회에서 세계 20등을 할 가능성이 당연히 없다고 생각해서 Qual A는 그냥 걸렀다 (아마 그 날 어디 나갔던 것 같다). Qual B도 비슷한 생각이었지만, 바쁘지 않고 앳코더 대회가 있으면 쳐야지. 그래서 쳤다.

D를 열고 시작했는데, 상당히 어려웠던 문제였다. 굉장히 ad-hoc한 느낌이 강했던 문제였고, 풀이의 방향성을 찾아도 그걸 구체화하기가 까다로웠던 문제였다. 상당한 시간을 쓴 후 결국 해결을 했는데, “괜히 참가하고 레이팅만 떨궜나” 하면서 후회했다. A B C를 풀고 돌아왔을 때도 그냥 그랬던 거 같은데, E가 순조롭게 풀리면서 분위기가 전환되었다. F 역시 순조롭게 풀이를 찾아서, 이 때 불꽃코딩 (…) 을 시전했다. 모든 문제를 푸니까 10등이 되었다. 이 때까지는 참가가 불확실했지만, 결국 참가 자격 + 불참자 등 갖가지 것을 모으니 온사이트 티켓이 떨어졌다.

한국에서는 나와 박성관 박범수 형, 세 명이 초청을 받았다. 성관이형은 영국 여행 일정이 있어서 불참하기로 했고, 결국 나랑 범수형이 갔다. 사실 나도 대만 화롄 리저널을 갈까 고민하고 있었다. 하지만, 화롄을 갔는데 앳코더 티켓이 떨어졌다면 아주 억울했을 것 같아서 그냥 포기하고 태국으로 계획을 바꿨다.

Day 0

전날 서울에서 잔 후 범수형과 함께 인천공항으로 출발했다. 갈 때 비행기를 한 10분 기다렸나? 굉장히 긴박하게 움직였다. 다음에는 조금 더 진지하게 약속 시간을 잡아야 겠다고 느꼈다.

비행기에서는 상당히 공포스러운 시간을 보냈다.. 이 부분은 트위터와 페이스북에 올렸던 글을 인용한다. ground-up은 비행기 1000 운항 중 1~3번 꼴로 일어난다고 한다. 좋은 경험이었다..

앳코더 온사이트 대회인 Code Festival 2017에 가려고 일본행 비행기를 탔는데.. 비행기가 나리타에 착륙하려다가 갑자기 급상승하더니 상공을 뺑뺑이 돌기 시작. 어리둥절하고 있었는데 안내방송으로 무려 “technical problem in aircraft” 라는 말이 나왔다. 무슨 날씨 문제나 공항 문제도 아니고 무려 비행기가 고장났다고..

비행기를 최근에 꽤 탔던거 같은데 기체 이상이라는 말도 안되는 상황은 듣도 보도 못해서, “와 인생이 이런건가” 하면서 득도해버리고(..) 공포의 30분 뺑뺑이 시작. 5시 반인데 도쿄는 깜깜하고, 기체도 깜깜하고, 계속 흔들리고, 진짜 무서웠다.

한참 돌다가 결국 착륙이 시작되었고, 다행이도 무사히 안전하게 착륙했다. “기체 안전 점검”이 이유였다고 하는데 잘 모르겠다. 활주로와 플랫폼에는 앰뷸런스가 도착해 있었다. 정말 무슨 일이었을까.

이제 호텔 가는 것도 문제. 둘 다 일본어를 전혀 못 하고 일본 경험도 많지 않은데, 도쿄 지하철 졸라 복잡하다.. 끝없는 검색질 끝에 케이세이 본선이라는 걸 탔다. 길 잃으면 도와주세요 ㅠㅠ

그 케이세이 본선은 숙소 앞까지 잘 와 주었다. (그리고 방콕 공항철도에서 광고도 하더라. 인싸 기차...) 호텔은 역에서 가까운 거리가 아니어서, 이후 구글 지도를 열심히 활용해서 도착했다. 호텔 건물 아래에는 카레 체인점이 있었는데 아주 맛있게 먹었다.

Day 1

호텔에서 행사장인 “아키하바라 UDX”까지는 걸어서 약 30분 정도의 거리였다. 아침 시간 이후 여유가 상당히 있기에, 아니 솔직히 말해서 지하철 탈 줄 몰라서, 그냥 걸어갔다. 아키하바라역 근처에서 헤메서 실제로는 30분보다 조금 더 걸렸다.

대회의 계획에 대해서 안내를 들었는데 상당히 흥미로웠다. 일반적으로 기업 이름 붙은 행사를 가면 절대 다수의 경우 대회하고 땡이다. 다른 게 붙는다면 Excursion 내지는 회사 홍보. 대회하고 땡인 건 Code Festival도 마찬가지인데, 여기서는 대회를 4개 한다는 것이 차이점이다 (…) 각각의 대회들이 굉장히 다른 목적을 가지고 진행되는데, 이에 대해서는 글을 통해 차근 차근 설명할 예정이다.

Grand Final (12:30 ~ 15:30)

처음 진행되었던 대회로, 일반적으로 생각하는 “개인 대회” 와 크게 다르지 않다. 각 참가자는 3시간 동안 10문제를 해결하게 되며, 룰은 일반적인 AtCoder 대회와 비슷하다. 실제로 해 보면 AGC를 3시간 동안 하는 느낌이다. 4개의 대회 중 유일하게 상금이 걸려 있는 대회고, 액수는 카카오 수준으로 국제 온사이트 중에서는 큰 편에 속했다.

나의 경우에는 초반에 순조롭게 말리면서 시작했다 (…). 초반 세 문제가 쉬운 편인데, 나는 첫 문제에서 가능한 답 16개를 하드코딩하다가 말리고… 세번째 문제에서는 무려 4번을 틀렸다. 페널티가 안 들어가지만 암튼 3문제 타이밍에 40~60위권이었다. 그런데 D가 너무 웰 노운이라 4분컷하니까 20위 안팎이 되었다 (??)

이후 E를 시도했다. 뭔가 쿼리들에 대해서 그래프를 그리고, 부분 합 관련 식을 쓰면 될 것이라는 아이디어가 떠올랐지만, 더 진행이 안 되었다. 내가 맞는 방향으로 접근했는데 말린 것인지, 이런 식으로 문제를 풀 수 없는 것인지 헷갈리기 시작했다. 이 때 팰린드롬이라는 성질을 사용해서 문자열을 착 접어 줄 수 있다는 아이디어가 번뜩 떠올랐고, 이걸 사용하니 문제의 복잡했던 점이 착착 풀려나가기 시작했다. 이후 어렵지 않게 코딩해서 만점을 받았다. 이 때 1x등 대였던 것 같다.

그 후 F와 G를 슥 봤다. F는 이상한 construction 문제라 크게 자신이 없었고, G는 문제의 디스크립션에 “game” 이라는 단어가 들어가서 걸렀다 (…) 할 게 없는 상황이었는데, J번 문제의 제목이 “Tree MST” 였다. 내가 좋아하는 트리가 두 번 등장해서 문제를 읽어보았다. 문제의 내용은 독특한 형태로 cost가 주어진 완전 그래프에서 MST를 찾는 문제. 처음에는 프림이나 Boruvka’s Algorithm 같은 걸 사용해서 비벼보려 했지만 (최적 간선을 적당한 자료구조로 O(lgn) 에 찾는 등의 전략) 깔끔한 게 바로 떠오르지 못해서 다른 방법을 조금 더 생각해 봤다.

이 때 트리 분할 정복이 문득 떠올랐는데 이런 쪽으로 접근하니 굉장히 문제를 쉽게 풀 수 있었고 빠르게 코딩한 후 AC를 받았다. E번 문제 AC의 뽕이 가시지도 않은 상태에서 (…) J번 문제를 first solve하고 등수도 최상위권으로 올라왔기 때문에 (1등 ~ 3등 으로 기억) 매우 즐거웠다. 역시 이 맛에 PS하나 싶었음. 그 이후에는 F에 시간을 거의 때려부었지만 그다지 좋은 결과가 안 나왔고… 게임이라서 읽지 않았던 G는 사실 그거와 상관없는 simple DP 문제였던 것으로 밝혀졌다. G 코딩에서 이상하게 시간을 많이 썼던 것 같은데 아무튼 AC를 받았다.

후반부 시간을 그렇게 효율적으로 쓰지는 못했지만, J에서 냈던 점수차가 상당히 컸기에 5등 상을 받을 수 있었다. 상금은 80만원이고 후기를 완성하기 전에 입금이 되었다. 상장이 어떻게 생겼는지 간단히 소개하자면…

뭔가 엄청 근사하게 생겼다. 과연 안에 뭐가 있을까 (두근두근)

??? ㅋㅋㅋㅋ


암튼 올해 했던 모든 대회 중 가장 즐거웠고 잘 했던 대회였던 것 같다.

Intermission (15:30 ~ 19:30)

대회가 끝나면 자유 시간이 주어진다. 이 때 할 수 있는 것은

  • Connection Hunt. 질문을 하나 생각한 다음에, 아무 참가자나 찾아가서 질문에 대한 답변을 듣고 적으면 된다. 일정한 횟수의 질문을 채우면 상품을 준다. 서로 말 틀 일 없는 사람들끼리 말 붙이게 해주는 친목 조성용 행사이다. 난 이 때 tourist에게 가서 대답을 받고 “팬이에요” 를 시전했다. (진짜 했다.)
  • 무슨 북 달려있는 리듬 게임 기계가 있었다. 범수형이 아는 걸 봐서는 그 바닥에서 굉장히 유명한 게임인 것 같다. 재밌을 것 같았는데 아쉽게도 해 보진 못했다 ㅠㅠ
  • Solution sketch : 일본어로 문제 풀이를 해 주는 분이 계셨다. 못 알아 들었지만 풀이 설명하는 느낌이 아니라 거의 만담을 하는 느낌이었다. 어떻게 풀이를 저렇게 즐겁게 설명하나 싶었다 ㅋㅋ 나중에 알고보니 AtCoder 사장 chokudai 님이었다.
  • 출장 뷔페. 퀄은 대전 리저널보다는 조금 안 좋다. 초밥이 나와서 많이 먹었다.
  • Coding in Japanese calligraphy : 붓으로 종이에 코딩을 할 수 있다. 더 이상의 자세한 설명은 생략한다 (…) 꼭 코딩을 해야 하는 건 아니다. 텍스트를 쓸 수도 있고, QR코드를 그리신 분도 있다 (…)
  • 그 외에도 더 있었음

난 Connection hunt를 하고, 돌아다니면서 뭔가 친목친목 하려고 애를 쓴 기억이 있다.

Intermission이라고 묶어서 얘기했지만 사실 이 안에서도 공식적인 행사들이 몇 개 있었다. 다 기억하지 못할 수는 있지만 그 중 확실히 기억나는 건 참가자 인터뷰. 각 대륙에서 참가자들을 한 명씩 선정해서 인터뷰를 한다. 이 때 tourist가 말하는 걸 들을 수 있었는데 농담도 잘하고 언변이 대단히 좋았다. 프로그래밍 대회 천재들은 뭔가 말을 어눌하게 하고 맥이 빠지지 않았을까? 라고 생각하면, 가장 확실한 반례라고 할 수 있다.

Exhibition (19:30 ~ 20:30)

두 번째 대회… 라고 해야 하나? 하지만 대부분의 참가자가 경쟁하지 않는 대회이다. Final 성적 세계 top 3, 일본 top 3, 스폰서 3인 팀으로 3인 x 3팀을 꾸리고, 1시간 동안 2문제를 고민하게 하는 Exhibition Round가 진행되었다. 나머지 참가자들은 이 팀들이 코딩하는 모습과 코드를 라이브로 볼 수 있다. 말 그대로 “관전용 대회” 인 것이다.

문제는 상당히 어렵다. 참가자들이 올 솔브 못하게 하도록 잘 나온다 ㅋㅋ 이 시간에는 대회를 관전할 수도 있고, 오픈에 가서 직접 문제를 풀 수도 있고, 아무거나 할 수 있다. 나의 경우에는 이 때 다른 2명 (desert97, Reyna) 와 문제를 풀었었는데, A와 B 모두 손도 못쓰고 GG쳤다. 정확히는 내가 뭔가 생각하기 전에 저 친구들이 다 떠올려 놓은 상황이었다 (…)

라이브 스크린에는 각 팀들의 코드, 화면, 스코어보드, 그리고 가끔 Editorial이 뜬다. 아마 코딩 대회를 스포츠스럽게 하기 위한 실험의 일환이 아닌가 쉽다. Editorial이 나오기에 혹시 스포 당할까봐 걱정이 됐는데 다행이도 팀에서 훨씬 빠르게 스포를 해 주었다 (…..)

이렇게 대회가 끝나고 대략 9시 쯤에 해산했다. 지하철을 탈 줄 몰랐는데, 같이 숙소로 갔던 Reyna가 알려줘서 왔던 것보다 훨씬 편하게 돌아갈 수 있었다. 숙소에 들어가서는 범수형이랑 놀다가 한 1시 쯤에 잔 것 같다.

Day 2

Tournament (10:00 ~ 13:00)

Final에서 성적이 비슷한 사람들끼리 묶어서 그룹을 6개 만들고 (16 x 6), 3번의 대회로 그룹 하위권을 탈락시킨 후 최종적으로 각 그룹마다 top 3을 뽑는 대회이다. “성적이 비슷한 사람”을 묶었다는 것은, Final에서 좋은 성적을 냈다면 잘하는 사람 위주로 팀이 엮여서 top 3가 되기 매우 힘들다는 것을 의미한다. 반대로, Final에서 좋지 못한 성적을 냈다면 못하는 사람 위주로 팀이 엮여서 그 안에서 top 3가 될 수 있는 기회가 생긴다. 하위권 참가자들에게 우승의 즐거움을 준다는 데 이 토너먼트의 의의가 있지 않나 싶다. 난 제일 성적이 높은 그룹으로 묶였기 때문에 우승의 즐거움에 대해서 딱히 기대할 수는 없었다 (…)

각 대회는 30분(!!)에 2문제가 주어진다. 하지만 그 중 자명하게 풀리는 문제는 거의 없다. 그래서 정말 빠른 생각과 코딩이 필요하다. 또한 서브태스크가 있기 때문에 순간의 판단이 아주 중요하다.

첫번째 Round에서는 16명 중 10명이 진출하고 6명이 탈락한다. A번 문제는 잘못 읽어서 시간을 많이 낭비했다 (잘못 읽은 버전은 정말 못 푸는 문제라고 생각한다.) 다행이도 B번 문제가 쉬운 거라서 빠르게 코딩하고, 초고속으로 A 백트래킹을 코딩해서 맞았다.

두번째 Round에서는 10명 중 5명이 진출하고 5명이 탈락한다. A를 또 몇 번씩 잘못 읽다가 돌돌 말렸고, 30분이 너무 빠르게 지나가서 아무것도 못하고 여기서 떨어졌다 (…) B번 문제는 약간 낚시성이 있는 문제였는데, 논란이 있었지만 난 못풀었으니 가만히 있겠다..

그래서 세번째 Round를 버추얼로 참가했다. 세번째 Round는 40분이 주어진다. A번 문제는 HLD 트릭을 알면 쉽게 풀 수 있는 것이었고, B번 문제는 조합식을 통해 2^N 백트래킹을 짠 후 냅색으로 환원하는 느낌의 문제였다. 그렇게 세번째 Round에서 모든 문제를 다 풀었는데, 실제 참가자 중 모든 문제를 푼 사람이 많지 않다는 것을 깨달았다. 약간 기쁘면서 또 슬퍼졌다.

전반적으로 “빠른 문제풀이” 에 상당히 집중된 예능성이 강한 대회였다. 100m 달리기 같은 느낌. 이런 식으로 에너지를 팍 집중해서 문제를 풀면 긴장감이 엄청나서 상당히 재밌다 불꽃코딩 물론 진지한 대회를 이런 식으로 운영하면 당연히 부적절하겠지만, 이런 다양한 대회 경험이 Code Festival의 장점이라고 느꼈다.

이 대회의 진짜 승자들은 첫날 Grand Final에서 나쁜 성적을 낸 탑 랭커들이었다. Grand Final 때 문제를 역순으로 풀기 시작하다가 결국 한 문제도 못 풀어서 꼴등을 한 cospleermusora가 그룹 6에서 양학을 하고 Round 3을 올클리어 했으며, 투심플(apiad)도 비슷했다. 좋은 건지 나쁜 건지는 모르겠지만 보는 입장에서 재미는 있다 (?)

Relay (15:00 - 17:00)

마지막 대회인 Relay는 100명의 참가자를 10인 * 10팀으로 묶어서 진행하는 팀전이다. 팀은 Final 성적을 기준으로 최대한 공평하게 나눈다. 일반적으로 팀전이라고 하면 3명 단위로 묶는 경우가 대다수라 무려 10명이 묶인 팀 대회는 어떻게 될지 잘 상상이 안 갈 것이다. 그 룰도 상당히 재밌는데 소개를 하자면…

먼저 사람들이 모두 모여있는 거대한 탁자가 있고, 저 멀리에 코딩용 컴퓨터가 있다. 탁자에서는 제출한 코드를 볼 수 있는 모니터가 있고, 사람들이 모여서 토론, 디버깅 등 원하는 걸 할 수 있다. 코딩을 하고 싶으면 멀리 떨어진 코딩용 컴퓨터로 가야 하는데, 한 사람에게 배정된 문제는 그 사람이 꼭 풀어야만 하며 (다른 사람한테 줄 수 없다!) 코딩용 컴퓨터로는 종이 등을 일체 들고 갈 수 없다. 이렇게 해 놓으면 잘하는 사람이 캐리하는 경우를 상당히 줄일 수 있어서 굉장히 똑똑한 설계라고 생각했다.

우리 팀에는 대회 때 10n - 5등을 한 사람들이 모여 있었다. 그 중 핸들을 알고 있는 사람은 yokozuna57, sigma425, zemen 정도. 처음에 약간의 Ice Breaking 시간을 가지고 팀 전략을 회의하기로 하는데, Ice Breaking은 우리 조에서 잘 안 됐고 (..) 팀 전략은 다들 별 게 없이 그냥 대회 성적이 높은 사람이 어려운 문제를 잡는 걸로 (….) 했다.

대회가 시작하고 나도 문제를 받았는데, 상당히 수학적인 문제를 받았다. 입력은 사실상 정수 N 하나만 주어지는 문제. 하.. O(N^2) 정도의 알고리즘은 쉽게 고안할 수 있으나, 아무리 고민해도 답이든 아이디어든 아무 것도 안 나왔다. 뭔가 시간을 쓴다고 되는 게 아니라 완전 막혔다.. 라는 느낌이 들어서 문제를 빨리 민 다른 팀원들에게 부탁했는데 그래도 좋은 해결책이 나오지 않더라. 그리고 스코어보드 보면서 시간 때우고 생각하다가 결국 끄적거리기만 하고 시간 때우고.. 가장 어려운 문제로 나왔지만, 실제로는 솔브가 꽤 많이 나와서 긴장되기도 했었다.

그 때 “규칙이 이쁘지 않을까?” 라는 아이디어가 zemen에게서 나오고, 나는 그 말이 맞는지 어쩐지는 모르겠지만 지금 규칙성을 찾아보는 게 아주 좋은 아이디어일 거라고 생각을 해서 그냥 컴퓨터를 잡고 규칙성을 찾았다. 그랬더니 쉽게 규칙성을 찾았고 그냥 그걸 짜서 맞았다. 다른 팀들도 대부분 규칙성을 유추해서 풀었던 것 같은데 그렇게 좋은 문제는 아니라고 생각한다 ㅠ.

그리고 팀원들이 나머지 문제들을 열심히 밀면서 달려갔는데, 마지막 I번 문제에서 중요한 아이디어가 대충 다 나왔던 것 같지만 구현에서 문제가 있어서 결국 아쉽게도 모든 문제를 풀지 못했다. 대회 당시 올솔브가 한 4팀 정도 있었기 때문에 아쉬웠지만 그래도 즐거운 경험이었다.

17:00~

Connection Hunt 시상식이 있었는데, “가장 좋은 질문을 쓴 사람” 과 “가장 빠르게 50답변을 채운 사람”에게 상품이 주어졌다. 첫 번째 사람은 좋은 질문을 앞으로도 많이 하라는 의미에서 Google Home을 받았고 (…) , 두 번째 사람은 더 빠르게 답변을 채우라는 의미에서 세그웨이를 받았다. ㅋㅋㅋㅋㅋ 상품 선정은 정말 센스 있었던 것 같다. 그리고 사진을 찍고 Code Festival 2017은 마무리. 끝나서 슬펐고 여운이 많이 남은 대회였다.

저녁 이후에는 범수형이랑 “스시를 먹자!” 라고 하면서 스시집을 찾아 다녔다. 우에노에 있는 “스시잔마이” 라는 곳을 갔는데, 구글 검색 결과가 많이 나와서 줄만 서다 끝나지 않을까 걱정을 했지만 우리 자리 정도만 딱 남아 있었던 것 같다 ㅋㅋ 밥 위에 참치회가 많이 올려진 규동같은 걸 시켰다. 대회에 대한 회고 + 일본 또 오고 싶다 + 스시 맛있다 (…) 등의 얘기를 하면서 즐거운 식사를 하고 돌아왔다.

Conclusion

처음에는 퀄이 될 것이라는 기대 조차 안 하고 가볍게 갔던 대회이고, 대회 직전에도 신경 쓸 겨를이 없어서 크게 기대하지 않고 갔는데, 주최분들 덕분에 정말 훌륭한 경험을 하고 돌아갈 수 있었다.

일단은 Excursion 같은 게 아니라 프로그래밍 대회 자체로 즐길 수 있다는 생각을 했다는 게 대단했고, 실제로도 즐겁게 시간을 보냈다. 보통 대회가 끝나면 승자만 웃게 되는 게 어쩔 수 없는 운명인데, 등수와 상관 없이 모두가 즐거운 경험을 하고 갈 수 있었던 점이 정말 좋았다. 기본적으로, 대회 주최진들이 프로그래밍 대회에 관심이 많은 사람들이라, 좋은 대회가 무엇이고 사람들이 대회의 어떤 면을 좋아하는 것인지 잘 파악하고 있었으며, 또한 앳코더의 장점으로 자주 꼽히는 수준 높고 양이 많은 문제 풀이 존재하는 것도 이를 실현할 수 있게 했다. 사실 범수형이랑 “한국에서도 이런 대회가 가능할까?” 라는 얘기를 해 보긴 했었다. 문제 풀을 지금부터라도 쌓으면 할 수는 있는데 음…

다만, 시간을 내서 도쿄를 좀 돌아보고 올 수 있었으면 좋았을 거라는 후회는 있었다. 도시의 분위기도 좋았고 (사실 서울 같아서 친숙했던 것도 있다) 음식도 맛있었고. 나의 경우는 하루 정도는 쓸 수 있었는데 실제로는 그냥 월요일날 돌아와 버렸다. 다음에 누가 온사이트에 갈지는 모르겠지만 하루 정도 day off를 내는 것을 강력 추천.

Code Festival 2017의 후기는 이 정도로 마무리한다. 올해는 실력에 비해서 온사이트 복이 많이 있었는데, 앞으로 국내 프로그래밍 대회를 다 망하는 한이 있어도 이 복이 계속 있었으면 좋겠다 ㅋㅋ.내년엔 조금 더 신경써서 본선 진출을 노려볼 생각이다.

'생각' 카테고리의 다른 글

OS X에 새로 생긴 캡처 딜레이 없애기  (4) 2019.01.26
ACM-ICPC Jakarta Regional 2018  (2) 2018.11.30
Slaughterbots  (0) 2017.11.21
블로그 주소 변경  (8) 2017.04.17
Why We're Post-fact  (0) 2016.12.06
댓글
공지사항
최근에 올라온 글
Total
Today
Yesterday