Good Bye 2021

서론

3년 간의 고등학교 생활을 마치고 성인이 된 컴퓨터 전공하는 평범한 1학년 학생의 이야기입니다. 작년부터 전세계의 생활 패턴을 뒤바꾼 COVID-19 덕분에 대학 새내기 생활을 즐기지 못하는 저를 걱정하는 사람들이 종종 있던데, 방 안에 앉아서 하루 종일 컴퓨터만 하는 생활을 너무 좋아하는 저에게는 너무 행복한 시기였습니다.
월 단위로 구분해서 적을지 아니면 이벤트 단위로 구분해서 적을지 고민을 했었는데, 월 단위로 구분해서 3월까지 적다보니 너무 구린 것 같아서 다 지우고 이벤트 단위로 작성합니다.

2021년을 맞이할 준비

제목은 뭔가 대단한 이야기를 할 것 같지만 그냥 Good Bye, BOJ 2020 이야기입니다.

2020년 12월 31일 19:00부터 22:30까지 BOJ에서 Good Bye, BOJ 2020이 진행되었습니다. 저는 대회 출제진으로 참가했기 때문에 Gravekper님 방송에 참가해 제가 출제한 문제를 풀이하면서 2021년이 다가오는 것을 기다리고 있었습니다.

비교적 난이도가 낮은 전반부(ABCDE) 문제의 해설과 스코어보드 공개를 마쳤을 때 23시 40분 정도 되었던 것으로 기억하는데, 운영진과 참가자들이 각자 원하는 방식으로 2021년을 맞이할 수 있도록 약 30분 정도 쉬어가는 시간을 가졌습니다.

드디어 2021년이 되었습니다! 가족들과 함께 잠깐의 시간을 보낸 뒤 다시 대회 풀이 방송으로 복귀했습니다. 성인이 된 기념으로 맥주도 한 병 마셨습니다. 제가 출제한 또 다른 문제를 풀이해야 하는데 술을 마셔서 그런지 정신이 없네요. 취해서(?) 횡설수설하는 모습이 Good Bye, BOJ 2020! 풀이 방송에 박제되었습니다. 저스티스휘가 아니라 주(酒)스티스휘인가? 올해 1월 1일과 12월 25일에 한 번씩 술을 마셨는데, 두 번 중 한 번이 유튜브에 박제되어서 당황스럽네요…

2021년 목표 확인

올해 초에 몇 가지 목표를 세웠는데 많이 달성하지 못한 것 같아서 아쉽습니다.

  • BOJ 5000문제 (성공)
    • 6000문제를 풀었습니다.
  • solved.ac Master (성공)
    • solved.ac가 경험치 체제에서 AC Rating 체제로 바뀐 이후, 레이팅이 신경쓰여서 문제를 풀 의욕이 없어졌습니다. 레이팅을 신경쓰고 싶지 않아도 계속 신경쓰이길래, 풀이를 아는 모든 루비 문제를 풀어서 Master를 찍었습니다. 그 이후로는 레이팅 신경 안 쓰면서 다시 재미있게 문제 풀고 있습니다.
  • Codeforces 2400 (실패)
    • 작년 7월 이후로 한 번도 참여를 안 했고, 내년부터는 다시 열심히 할 생각입니다. 가끔 심심할 때 문제를 조금씩 풀어보는데 아직 감이 많이 떨어지지 않은 것 같아서 다행인 것 같습니다.
  • AtCoder 2000 (실패)
    • 주말마다 계속 다른 할 일이 있어서 거의 참가를 하지 못했습니다. 꾸준히 치면 2000은 갈 것 같은데… ABC가 8문제가 된 이후로 재미없어서 안 하고 있습니다.
  • ICPC / SCPC 수상 (실패)
    • 상을 받을 수 있을 것 같다고 예상했던 ICPC와 SCPC는 상을 못 받았고, 대신 상을 못 받을 줄 알았던 UCPC에서 상을 받았습니다.

학교 생활

연구실

11월에 숭실대학교 합격 발표가 나서 블로그 자기 소개 페이지에 숭실대학교를 적어놓았는데, 입학도 하기 전인 1월에 우연히 제 블로그에 들어온 교수님께서 해당 페이지를 보시고 학부 연구생을 제안하셨습니다. 이렇게 해서 신입생 OT와 입학보다 학부 연구생을 먼저 하게 되는 놀라운 경험을 했습니다.

6개월 동안 일하는 것으로 계약했습니다. 처음에는 의욕을 갖고 논문도 읽어보고, 입학 전이라서 시간이 많아 코드도 어느정도 작성했습니다. 하지만 개학을 하니 과제랑 대회 준비에 치이면서 시간을 거의 투자하지 못했습니다. 지식이 부족한 것도 한 몫 했고요. 계약 기간이 끝나고 돌아보니 많이 기여를 못한 것이 아쉽습니다.

입학 전

마지막으로 아무 생각 없이 놀 수 있는 시기라서 마음껏 놀고 싶었지만, 슬프게도 고등학교 3년 내내 PS만 했기 때문에 노는 방법도 잘 모릅니다. 결국 ‘입학하기 전에 BOJ에서 4000문제를 풀자’ 라는 생각에 한 달 동안 열심히 랭작을 했습니다. SCCC에 스카우트 돼서 1월에 겨울방학 스터디에도 참여했습니다.

신입생 OT 도중에 “특기자로 들어왔을 것 같은 관상이다” 라는 말을 들은 것도 기억나네요. 무슨 느낌인지 잘 알아서 딱히 반박은 못하겠습니다. 이런 이야기를 들으면 기분 나쁜 사람들도 있는데, 저는 중학생 때부터 많이 들은 이야기라서 그런지 별 감흥이 없습니다.

1학기

입학을 했고, 1학기에 21.5학점을 신청했습니다. 전공 과목들은 전부 고등학교에서 배운 내용들이라 부담이 적었고, 교양은 딱히 학점을 챙기고자 하는 의욕이 없어서 공부를 안 했기 때문에 결국 고등학생 때와 마찬가지로 PS만 했습니다. 절대평가 덕분에 학점은 괜찮게 나왔습니다.

2학기

1학년은 1년 동안 40학점만 들을 수 있다고 하더군요. 마침 전공기초 + 교양필수가 18.5학점이라서 그것만 신청했습니다. 1학기와 마찬가지로 학점을 챙기고자 하는 의욕이 없어서 또 PS만 했습니다. 심지어 확률과 통계 기말고사는 시험 범위 1/3도 공부하지 않은 채로 시험을 보러 갔습니다.
내년부터는 공부 좀 해야 하는데… 고3 때도 공부 안 했던 거 생각하면 제가 공부를 할지 의문이네요.

대회 참가

시간 순서대로 나열합니다. 문제 이야기는 적지 않습니다.
UCPC에서 수상하고 SCPC와 현대 모비스 본선 진출할 때까지만 해도 일이 잘 풀리는 느낌이었는데 SCPC 본선과 ICPC를 완전히 망쳤습니다. 내년에는 잘할 수 있을지 불안하네요…

Google Hash Code

열심히 팀원을 찾아보니 cs71107 / jhnah917 / klimmek55 / wookje라는 괜찮은 구성의 팀을 만들었습니다. 팀 이름은 매우 정직하게 wookje7110755917로 지었습니다. klimmek55님의 버스 운전 실력 덕분에 제 실력에 비해 매우 높은 한국 7등이라는 성과를 거두었습니다. 이런 대회는 어떻게 준비해야 할지 잘 모르겠네요… 너무 어려웠습니다.

Reply Code Challenge Teen Edition

2020년에 참가해서 망했던 대회에 올해 또 참가했습니다. 20살이지만 아직 만 나이로 10대라서 Teen Edition에 참가할 수 있더군요. 팀원은 선린 4명이 뭉친 hnsk2109 / jhnah917 / junseo / solsam10이고, 팀 이름은 작년과 동일하게 No Reply Team입니다. 작년에는 한 명이 혹사당하는 형태로 대회가 진행되었는데, 올해는 Codeforces Master가 2명 있어서 부담을 분산시킬 수 있었습니다.

4번 문제가 Half Plane Intersection의 넓이를 구하는 문제라서 날로 먹을 생각을 했는데, 데이터가 잘못된 건지 모든 팀이 Hidden Test를 맞추지 못했습니다. 만약 맞았다면 순위가 많이 올라갔을 것 같아서 아쉽습니다.

1923팀 중 18등, 특히 한국 팀 중에는 2등을 기록했습니다. 작년보다 순위가 많이 올라서 기뻤습니다.

UCPC

이왕이면 UCPC 멤버로 ICPC까지 같이 참가하는 것이 좋을 것 같아 교내에서 팀원을 구했습니다. SCCC 슬랙에서 열심히 팀원을 구한 결과, Codeforces Candidate Master 2명과 함께 참가를 하게 되었습니다. 팀원은 enochjung / jhnah917 / lobo_prix이고 팀 이름은 AC-Complete입니다.

예선은 무슨 짓을 해도 통과한다는 확신이 있어서 각자 집에서 참가하기로 했습니다. 프리즈 전에 8문제를 풀었고, 프리즈 동안 한 문제도 풀지 못하면서 17등으로 마무리했습니다. 이것보다 더 좋은 성적을 낼 수 없다고 느껴질 만큼 괜찮았다고 생각했지만 17등 밖에 못한 것을 보고, 본선에서 수상을 못할 것 같다는 예감이 들었습니다.

본선은 학교에 모여서 참가했습니다. 프리즈 전에 6문제를 풀었고, 예선과 마찬가지로 프리즈 이후로 한 문제도 풀지 못하면서 17등으로 마무리했습니다. 정말로 예선보다 더 좋은 성적을 내지는 못했습니다. 15등까지 수상 대상이기 때문에 많이 슬펐지만, 16 ~ 21등에게 주는 특별상을 받아서 다행이었습니다. 은퇴/휴학 팀을 생각했을 때, 열심히 준비하면 ICPC에서도 수상을 할 수 있다는 느낌이 들었습니다.

SCPC

1차 예선은 대충 풀었고, 2차 예선은 열심히 풀어서 본선에 진출했습니다. (예선 후기)

본선 후기가 블로그에 올라가지 않은 것을 보면 알 수 있지만, 본선을 말아먹으면서 수상을 못했습니다. 작년 기출을 토대로 전략을 세웠는데, 올해 1번이 작년 1번에 비해 많이 어려웠던 탓에 전략이 꼬이면서 망했습니다. 내년에는 상을 받을 수 있을까요?

현대 모비스 알고리즘 경진대회

예선 상위 50등이 본선에 진출하고, 본선은 50등까지 상을 주는 대회입니다. 즉, 예선만 통과하면 본선에서 0점을 받아도 상을 받을 수 있습니다.

예선은 시간 제한 관련해서 이슈가 있었습니다. 마지막 문제에서 맞는 것 같은 코드를 제출해도 TLE가 발생하는 이슈가 있었는데, 지금까지 PS를 하면서 터득한 상수 커팅 테크닉을 열심히 사용해서 겨우 만점을 받았습니다. 만점자는 전부 본선에 진출했고, 만점자가 아닌 사람은 1~2명 정도 본선에 간 것으로 알고 있습니다.

본선 문제는 예선에 비해 많이 어려웠습니다. 결국 부분 점수만 긁다가 대회가 끝났고, 5등상을 받게 되었습니다.

ICPC

UCPC와 동일하게 AC-Complete 팀으로 참가했습니다. 예선은 교내 2등만 하자는 마인드로 편하게 참여했습니다. 실제로 대회 당시 끝나기 1시간 전에 교내 2등을 확정지은 뒤에는 풀이가 나온 문제가 있지만 구현하기 귀찮아서 안 하고 그냥 놀았습니다. 덕분에 5솔브라는 처참한 결과와 함께 주변 사람들에게 무수한 놀림을 받았습니다…

본선은 대회 초반에 꽤 순위가 높았던 것으로 기억하는데 EFG를 모두 못 풀어서 결국 수상권에 들지 못했습니다. 내년에는 누구랑 나가는 것이 좋을지 모르겠네요.

대회 운영

총 21개의 대회 운영에 참여했습니다. 원래는 대회 별로 짧게 후기를 쓰려고 했는데, 정리를 해보니 너무 많아서 기억에 남는 대회만 몇 개 적었습니다.

  • BOJ 오리지널 대회
    • Good Bye, BOJ 2021
    • 제3회 IDT Cup / Semi-Game Cup 2 / Orange Cup
  • 대학교 교내 대회
    • 카이스트 봄 대회
    • 고려대학교 교내 프로그래밍 대회 / 정보대학-정보보호학부 교류전 / 알고리즘 동아리 내부 대회
    • 강원대학교 / 연세대학교 미래캠퍼스 / 서강대학교 / 한양대학교 / 인천대학교 교내 프로그래밍 대회
  • 고등학교 교내 대회
    • 선린인터넷고등학교 알고리즘 페스티벌 예선 / 알고리즘 페스티벌 본선 / 알고리즘 경시대회 / 가을맞이 알고리즘 대회
    • 경기과학고등학교 / 경기북과학고등학교 (2번) / 세종과학예술영재학교 교내 프로그래밍 대회

각종 선린 교내 대회

알고리즘 페스티벌(천하제일)과 알고리즘 경시대회에 20문제 중 13문제를 출제하고 17문제의 데이터를 만들었습니다. 졸업하고 출제하려고 2년 전부터 열심히 모은 문제 아이디어를 전부 쏟아내었습니다. 문제를 세팅하다보니 난이도 분포가 망한 것 같아서 불안했는데, 스코어보드가 이쁘게 나와서 기분 좋았습니다. 출제 후기는 여기에서 볼 수 있습니다.
가을맞이 대회는 전부 2학년 재학생들이 출제했습니다. 저는 지문 수정, 데이터 제작, 데이터 검증 위주로 검수를 했습니다. Beginner Division 문제 난이도 분포가 조금 아쉬웠습니다.

각종 고려대학교 관련 대회

ALPS 5월 내부 대회에서는 문제 검수가 아닌 서버 관리를 했습니다. 이때 CMS로 직접 대회를 열면서 CMS 세팅 튜토리얼을 블로그에 올렸습니다. 튜토리얼 2편 아직도 안 올렸는데 언제 올릴지 모르겠습니다.
정보대학-정보보호학부 교류전는 문제 검수와 서버 관리, 그리고 각종 잡무를 수행했습니다. 마라톤 매치 형식의 대회를 운영하는 것은 처음이라 대회 형식(특히 제출 방식)에 대해 많이 고민했는데, 결국 (시간 제한 3초 / 코드 제출) + (제출 간격 1분) + (Pretest / Systest) + (마지막 제출만 반영)으로 결정했습니다. Pretest를 도입해서 대회 중의 서버 부담을 줄이고, 마지막 제출만 반영하기 때문에 시스템 테스트도 힘들지 않았습니다.
KCPC는 대회 2일 전에 검수로 투입되었습니다. 원래는 마지막 문제를 검수하기 위해서 들어갔지만, 30시간 동안 고민했는데 못 풀고 다른 문제들만 검수했습니다… 풀이는 뻔한데 구현은 도저히 못하겠네요ㅠㅠ

IDT Cup

지인들과 카페에서 음료를 마시던 도중, 갑자기 IDT Cup 출제자가 카페로 찾아와서 검수진으로 납치해갔습니다. 저는 대부분의 시간을 BOJ 21731 메시라이브에 투자해서 데이터를 강화시켰습니다. Dinic’s Algorithm에 Capacity Scaling을 적용한 코드, Push-Relabel Algorithm을 각종 휴리스틱으로 최적화한 코드 등 대회 시간에 생각할 수 있는 대부분의 방법을 모두 막았습니다.
대회가 끝나고 5달이 지난 올해 10월에 서로 다른 3가지 알고리즘을 조합해서 AC를 받을 수 있는 코드를 만들긴 했는데, 저는 양심적인 PS러이기 때문에 제출은 하지 않았습니다. 이건 어떻게 막아야 할까요? 막을 수 있는 방법이 존재하긴 하나…

Semi-Game Cup 2

검수진에 저보다 잘하는 사람들이 많이 있어서, 저는 문제 풀이 검수가 아닌 Validator / Checker / Interactor 등을 검수했습니다. 검수 날로 먹고 운영진 상품까지 받아서 기분 좋았습니다.

Good Bye, BOJ 2021

2019, 2020년에 이어서 올해도 운영진이 되었습니다. 원래 출제를 하려고 했지만, 아이디어가 다 떨어져서 결국 출제를 하지 못했습니다. 이 글을 올릴 때만 해도 이렇게 루팡을 할 줄 알았지만…

D번과 G번 문제 출제자분들이 풀이 영상을 녹화하지 못하는 상황이라 제가 하게 되었습니다. D번은 3번 정도, G번은 10번 정도 녹음했습니다. 덕분에 2021년 12월 31일과 2022년 1월 1일에 많은 BOJ 유저들이 강제로 제 목소리를 듣게 되었습니다.
대회 뒷풀이 방송에서 스코어보드를 오픈할 때, 스팟보드의 특정 등수부터 오픈하는 기능이 비효율적으로 구현되어 있어서 방송 진행을 하시는 분의 컴퓨터에서 안 돌아가는 상황이 발생했습니다. 다행히 미리 제 컴퓨터에서 켜놓았어서 급하게 팀뷰어를 켜서 진행했습니다.

루팡하려고 마음을 나쁘게 먹어서 그런지 벌을 받은 기분입니다. Hello, BOJ 2022에서는 열심히 일하겠습니다.

2021년을 마치며…

2022년 목표

마지막으로, 내년 목표와 계획을 세울 차례입니다.
지금까지는 PS만 했지만, 이제 슬슬 다른 분야도 공부를 할 필요를 느끼고 있습니다. 고등학교 때의 경험에 의하면 개발은 별로 재미 없는 것 같아, 그나마 PS와 관련이 있는 분야부터 조금씩 확장을 해보려고 합니다.

  • Problem Solving
    • BOJ 8000문제
    • Codeforces 2400
    • AtCoder 2000
    • ICPC/SCPC 수상
    • APIO/IOI Call for Tasks에 낼 문제 생각하기
  • Non-PS
    • 각종 유량 알고리즘 공부 (Orlin, Parallel Push-Relabel, Scaling 등)
    • Professional CUDA C Programming 읽기
    • 추천 알고리즘 공부하고 CUDA로 구현해보기(?)
    • 병렬 처리 공부하기

마무리

인터넷을 통해 얻은 지식을 다시 인터넷에 돌려주겠다는 생각으로 블로그를 시작했었는데, 올해 들어 공부와 아르바이트를 핑계로 블로그에 글을 거의 올리지 않았습니다. 아르바이트(?)를 통해 얻은 강의 실력을 통해 내년에는 좋은 글을 많이 올릴 수 있도록 노력하겠습니다.