Good Bye 2022!

서론

컴퓨터를 전공하는 평범한 대학교 2학년 학생의 이야기입니다.
아무것도 안 한 것 같은데 벌써 또 1년이 지났습니다. 작년(링크)에는 한 것도 많고 할 이야기도 많았는데 올해는 별로 쓸 내용이 없어서 괜히 기분이 안 좋습니다. 그래도 올해 느꼈던 감정은 지금 기록해두지 않으면 까먹을 것 같아서 이번에도 글을 작성해 봅니다. 작년과 마찬가지로 PS와 학교 이야기를 다룹니다.

2022년 목표 확인

올해 초에 야심 차게 목표를 세웠는데 이룬 건 별로 없습니다. 슬슬 PS 말고 다른 것도 공부를 해야 할 것 같은데 어떤 것부터 해야 할지 모르겠습니다.

  • BOJ 8000문제 (성공)
    • 성공했습니다.
  • Codeforces 2400 (실패)
    • 작년에 이어서 올해도 실패했습니다. 코드포스를 안 하는데 레이팅이 오를리가 없지…
    • 열심히 하면 2300은 금방 갈 것 같은데 별로 하고 싶다는 생각이 들지 않습니다.
  • AtCoder 2000 (성공)
    • ABC가 8문제로 바뀐 이후로 재미 없어져서 안 했는데, 그래도 2000은 찍고 싶어서 꾹 참고했습니다.
  • ICPC 수상 (성공)
    • 하고 싶은 말은 대회 후기(링크)에서 전부 했으니 생략합니다.
  • SCPC 수상 (실패)
    • 작년에 이어서 올해도 실패했습니다. 내년에는 받을 수 있을까요?
  • 각종 공부 (실패)
    • 중간고사 준비 - 기말고사 준비 - 선린 대회 운영 - SCPC 준비 - 중간고사 준비 - ICPC 준비 - 기말고사 준비 - BOJ 연말 대회 운영
    • 덕분에 다른 걸 공부할 시간이 없었습니다. 내년에도 비슷할 것 같은데 어떡하지…

학교 생활

전공 공부

1년 동안 다양한 과목을 들었습니다. 6년째 하고 있는 PS와 큰 관련이 있는 자료구조 알고리즘 문제해결, 선린에서 배웠던 객체지향과 안드로이드, 고등학생 때 혼자 조금 공부했었던 오토마타와 정수론을 다시 배웠습니다. 추가로 선형대수, 컴퓨터구조, 네트워크를 새로 배웠습니다.
전공 강의를 듣는 것은 재미있지 않습니다. 하지만 내가 알고 있는 내용과 새로 공부한 내용을 매칭 시키면서 시야를 넓히는 것은 흥미로운 일이기 때문에 아예 놓고 있지는 않았습니다. 특히 PS하면서 공부한 내용과 학교에서 배우는 전공 지식을 연관 짓는 것이 재미있었습니다. 예를 들자면…

  • 선형대수: PS하면서 대충 공부한 지식들 사이의 빈틈을 채워가는 기분
  • 컴퓨터구조: 온라인 저지에서 실행 시간 줄이겠다고 뻘짓하면서 공부한 것들이 그대로 나옴 (ex. 캐시, 연산 순서, 분기 예측 등)
  • 네트워크: 그래프에서 하던 것들을 똑같이 함, 고등학생 때 혼자 생각하던 휴리스틱 기법들이 그대로 교과서에 나옴, 정올 준비할 때 풀었던 인터랙티브/투스텝 문제와 비슷한 느낌
  • 오토마타
    • DFA, NFA: DP 점화식 세울 때 하던 거 그대로 함
    • CFG, CNF: 트리 디컴포지션을 nice한 트리 디컴포지션으로 바꾸는 알고리즘, 트리의 위상 관계를 유지하면서 이진 트리로 변환하는 알고리즘과 비슷함
    • Turing machine: :yum:

익명의 누군가가 “PS를 잘하기 위해서는 알고리즘과 상관없는 지식들까지 주워 먹어야 하는 슬픈 현실” 이라고 말했지만… 그래도 재미있으면 된 거 아닐까요?
그럼에도 불구하고 강의를 듣거나 시험을 위해 공부하는 것은 정말 따분하기 때문에, 강의 자료만 보면서 공부하고 모르는 내용이 있을 때만 영상을 돌려 보는 방식을 선호합니다. 그래서 저는 비대면이 좋습니다.

1/2학기에 각각 제일 재미있었던 과목은 문제해결과 오토마타였습니다. 과목 내용 자체가 재미있기도 하고, 교수님께서 강의를 정말 잘하셔서 좋았습니다. 한편으로는 이 두 과목을 고등학생 때 공부하지 않았다면 강의를 들으면서 받는 감동이 더 컸을 거라는 생각에 아쉬움이 생깁니다.

다음은 학기마다 가장 재미있었던 과목 3개씩 골라서 적은 후기입니다.

1학기 과목

전공은 자료구조, 문제해결, 객체지향, 선형대수을 들었고, 교양은 스피치와컨텐츠, 디자인씽킹과지식재산입문을 들었습니다.

자료구조는 전부 아는 내용이라서 편하게 들었고, 중간 기말 과제 전부 만점을 받았습니다.
문제해결은 과제가 BOJ 문제로 나오는 컴퓨터학부 최고의 꿀과목입니다. 3학년 전공과목이지만 숭실대에 있는 코드포스 레드 2명이 모두 휴학한 틈을 타 빈집털이를 했습니다. 기말고사 불참했어도 1등인 걸로 알고 있습니다. 한 학기 동안 3번 정도 문제 풀이 발표를 하는 것도 재미있었고, 이 경험은 다른 곳에서 강의하는데 많은 도움이 되었습니다.
선형대수는 PS하면서 어렴풋이 공부한 지식들 사이의 빈틈을 채워준다는 느낌으로 수강했습니다. 중간고사는 편하게 봤지만, 진도를 나갈수록 PS하면서 공부한 것들의 농도가 옅어지고 공부도 안 해서 기말고사 성적이 좋지 않았습니다. 주변에서 컴퓨터 전공으로 열리는 건 유사 선대라면서 수학과 선형대수를 다시 들어보라고 하던데…

2학기 과목

전공은 컴퓨터구조, 알고리즘, 형식언어및오토마타, 사용자인터페이스및실습, 컴퓨터네트워크를 들었고, 교양은 4차산업혁명과창업을 들었습니다. 그리고 수학과 전공인 정수론도 들었습니다.

오토마타는 올해 수강한 과목 중 가장 재미있는 과목이었습니다. 단순 암기만 하는 지루하고 재미없는 2학기 전공과목들 사이에서 유일하게 머리를 쓰는 과목이었습니다. 고등학교 3학년 여름방학 때 심심해서 잠시 오토마타 공부했던 것과 중간고사 범위가 완전히 동일해서 중간고사는 날로 먹었고, 기말고사 범위는 튜링머신 같은 익숙한 내용이 대다수라서 편하게 공부했습니다. 덕분에 중간고사와 기말고사 모두 1등을 했습니다.
알고리즘은 자료구조처럼 전부 아는 내용이라서 편하게 들었습니다. 제가 배우고 싶었던 방식인 이론과 증명 위주의 알고리즘 강의가 아니라서 조금 아쉬웠습니다.
정수론은 PS할 때 정수론 문제에서 많이 막혔던 기억이 있어서 수강했습니다. 중간고사 범위는 PS하면서 전부 공부했던 내용이라 날로 먹었고, 그 이후로는 모르는 내용이 조금씩 나왔습니다. 10월과 11월에 한 번씩 결석한 이후로 강의를 따라가는 것이 힘들어져서 기말고사는 중간고사에 비해 성적이 많이 떨어졌습니다. 평소에 증명이나 수식을 조금 무서워했었는데 덕분에 많이 익숙해졌고, 덕분에 오토마타를 더 편하게 공부했습니다. 대부분 아는 내용을 다시 배운 거라서 지금 당장은 PS에 큰 도움이 안 되지만, 앞으로 더 어려운 내용을 공부할 때 기반될 지식을 더 튼튼하게 다듬은 것 같습니다.

SCCC

소모임 회장할 사람이 없어서 제가 하게 되었습니다.

지난 2년 동안 비대면으로 인해 동아리 활동이 완전히 멈춰 있던 상황이었습니다. 코로나 이전에는 스터디, 대회, 회식, MT 등 다양한 일을 했었지만 2021년에는 어떠한 것도 진행되지 않았습니다. 제가 1년 만에 이것들을 모두 부활시키는 것은 무리인 것 같아서 일단 스터디를 살리는 것에 집중했습니다.
맨날 방에서 컴퓨터만 하는 저에게 회식과 MT는 너무 어려운 일이며, 대회는 준비해야 하는 게 너무 많기 때문에 올해는 힘들 거라고 생각했습니다. 대회는 아마 내년에 부활할 것 같습니다.

스터디 이야기는 뒤에서 이어집니다.

Problem Solving

이 블로그의 메인 콘텐츠입니다. 올해도 역시 많은 일이 있었는데, 하나씩 풀어보겠습니다.

대회

2017년 한국 정보 올림피아드 중등부를 시작으로 벌써 6년째 알고리즘 대회에 참가하고 있습니다. 6년이라는 시간 동안 제가 대회를 대하는 자세, 그리고 대회 결과를 받아들이는 방법이 많이 바뀌었습니다. 지금까지 문제만 풀었다고 생각했는데 그 과정 속에서 성장도 한 것 같습니다.

2017년과 2018년은 객관적으로 봤을 때 대회에서 상을 받을 수 있을 정도의 실력이 되지 않았습니다. 그때 당시에도 이 사실을 잘 알고 있었기 때문에 성적 욕심을 내기보다는 경험을 쌓는다는 생각으로 대회에 참가했었습니다. 따라서 대회 결과가 좋지 않더라도 크게 실망하지 않았습니다.

2019년부터 실력이 점점 오르기 시작하면서 대회 성적에 욕심이 생기기 시작했습니다. 하지만 욕심이 실력보다 앞섰던 건지 대회 성적은 늘 만족스럽지 않았고, 그 원인을 외부에서 찾으려고 했었습니다. 예를 들어 대회 운영이 이상했다, 오늘따라 컨디션이 안 좋아서 못했다, 내가 못 푸는 유형만 골라서 출제했다 처럼 쓸데없는 핑계를 대었습니다. 그리고 학교 선생님들의 관심이 부담스러웠던 것도 큰 스트레스였습니다. 교내 알고리즘 대회 예선(스코어보드 링크)에서 만점을 받고 6등을 했던 적이 있는데, 1주일 내내 만나는 선생님들마다 왜 1등을 못했냐고 이야기해서 기분이 좋지 않았던 기억이 있습니다.

2020년도 크게 다르진 않았던 것 같습니다. 하지만 지난 1년 동안 수도 없이 깨진 멘탈이 조금은 단단해졌는지, 대회 전의 긴장감은 확실히 2019년에 비해 적었습니다. 2019년에는 손까지 떨 정도였는데 2020년에는 대회 30분 전에 편하게 엎드려서 눈 감고 있을 정도의 여유가 생겼습니다. 실력도 많이 올라서 진지하게 참가했던 대회에서는 대부분 만족할 만한 성적을 받았습니다. 하지만 여전히 대회 성적이 만족스럽지 않을 때는 많이 무너져 내렸습니다.

2020년까지는 고등학생 대회에 참가했지만 2021년부터는 대학생 대회에 참가해야 합니다. 대학생 대회에는 더 무시무시한 고인물이 많기 때문인지, 2021년에 참가했던 대회는 대부분 대회가 끝나고 나서 벽을 느낀 기분이었습니다. SCPC가 끝나고 나서 제 실력이 많이 부족하다는 것을 깨달았고, ICPC가 끝나고 나서는 다른 것들을 탓할 기운도 없이 그냥 막막한 기분만 들었습니다. 그나마 다행인 점은, 남 탓만 하던 2년 전에 비해 원인을 저한테서 찾는다는 점에서 발전할 가능성이 있다는 것이었습니다.

작년에는 막막함을 느꼈다면, 올해는 “조금만 더”라는 생각이 많이 들었습니다. SCPC도 수상권에 근접했는데 마무리를 제대로 못 지었고, UCPC도 아쉽게 풀지 못한 문제가 2개나 있었고, ICPC도 실수를 하나만 안 했어도 한 등수를 더 올릴 수 있었습니다. 올해까지 답이 안 나오면 다른 길을 찾아봐야 하나 고민을 많이 했었는데 희망이 보이는 것 같아서 계속해보려고 합니다. 대회 참가하는 건 재미있으니까요.

아래는 참가했던 대회들의 아주 간단한 후기입니다.

Reply Code Challenge Teen Edition
팀원: jhnah917, junseo, hibye1217, jwpassion1
만 20세가 되지 않은 21살 1명과 20살 3명이 모여서 참가한 대회입니다. 3등까지 상금을 주는데 4팀이 만점을 받고 그중 4등을 했습니다…

현대 모비스 알고리즘 경진대회
예선 대회 운영이 많이 이상했습니다. 대회 운영의 문제점과 관련된 이야기는 잘 설명된 글이 있어 따로 링크합니다. (링크)
예선 마지막 문제가 minimum cut 문제인 것은 알았지만 그래프 모델링을 못했습니다. 대신 이상한 그리디 풀이로 만점에 가까운 점수를 받아서 본선에 진출했습니다.
본선에서는 3등상 이상을 받긴 어려우니 4등상(4~30등)만 받자는 생각으로 참가했고, 실제로 4등상을 수상했습니다. 작년보다 좋은 상을 받아서 좋았습니다. 내가 상 받으면 좋은 대회~

SCPC
올해 참가한 대회들 중에 가장 간절하고, 가장 열심히 준비했던 대회였습니다. 2차 예선까지는 아주 순조롭게 통과했지만 올해도 작년과 똑같이 본선을 망쳐서 상을 받지 못했습니다. 2번 문제의 핵심 관찰은 다 찾고도 풀지 못한 것이 많이 아쉬웠습니다. 내년에는 꼭…

UCPC / ICPC
팀원: jhnah917, edenooo, chansol
UCPC를 역대급으로 말아먹고 정신차린 결과, ICPC는 역대급으로 잘 봤습니다. 자세한 이야기는 대회 후기(링크) 참고

대회 운영

올해도 많은 대회를 운영했습니다. 기억나는 것만 몇 개 적어보려고 했지만, 기억할 만한 대회는 이미 후기 글을 적었거나 아직 대회가 끝나지 않아서 보안 상의 문제로 글을 적을 수 없는 상태입니다. 따라서 별 내용은 없습니다.

숭고한 연합 대회는 후기(링크)에서 이미 많은 이야기를 했으니 생략합니다.
각종 선린 교내 대회도 운영했습니다. 후기(링크)에서 이미 많은 이야기를 했으니 생략합니다.
Good Bye, BOJ 2022! / Hello, BOJ 2023!은 아직 대회가 끝나지 않았기 때문에 나중에 따로 적도록 하겠습니다.
원티드에서 주관하는 코딩 테스트인 쇼미더코드에도 문제를 출제했는데, 4회차까지 끝난 건 아니므로 나중에 기회가 된다면 따로 적도록 하겠습니다.

이 밖에도 생계유지와 취미 생활을 위해 출제 외주를 조금씩 진행했습니다. 예전에는 교육 업체들이 강사를 구하는 것에 집중을 했던 것 같은데 요즘은 문제 출제 관련 문의가 많이 들어옵니다. 다음에는 어떤 게 유행이 될지 궁금해집니다.

알고리즘 강의

올해도 다양한 곳에서 알고리즘 강의를 했습니다!

선린인터넷고등학교 정보올림피아드반 강의를 작년에 이어서 올해도 맡았습니다. 학생들이 열심히 공부할 테니 빡세게 굴려달라고 해서 강의 준비를 열심히 했는데, 일주일 동안 한 문제도 안 푸는 것을 보고 많이 실망했습니다. 원래 6시간 강의를 할 때는 18시간 정도 강의 준비를 했었는데 준비 시간을 6시간 정도로 줄이고, 겨울방학 강의는 안 한다고 했습니다. 작년과 분위기가 전혀 다른 느낌이었습니다.

신촌지역 대학생 프로그래밍 동아리 연합(ICPC Sinchon) 여름캠프의 중급반 강의도 했습니다. 후기에서 이미 많은 이야기를 했으니 생략합니다.

숭실대학교 문제해결 소모임 SCCC에서 1년 동안 진행한 모든 스터디를 제가 담당했습니다. 알고리즘을 처음 공부하는 학생들을 위한 기초 스터디, 기초적인 사전 지식을 알고 있는 학생들을 위한 중급 스터디, 그리고 solvedac 다이아~루비 / 코드포스 퍼플~레드 정도의 고인물을 대상으로 하는 고급 스터디를 진행했습니다.

봄에 진행한 기초 스터디는 코딩 테스트에서 다루는 내용을 전부 커버하는 것에 초점을 맞춰서 진행했습니다. 개인적으로 PS의 첫 관문은 재귀(를 가장한 귀납법 사고)라고 생각하기 때문에, 시중에 있는 다른 강의들에 비해 재귀 함수와 분할 정복을 일찍 다룹니다.
기초 스터디를 수강한 학생은 1월부터 시작할 중급 스터디에 참가하게 됩니다. 아직 시작하진 않았지만, ICPC Sinchon 캠프 중급반과 비슷한 구성으로 준비했습니다. 기초 스터디의 내용보다 조금 어려우면서도 알고리즘 대회 기준으로는 기초에 해당하는 내용들을 다룹니다. 8번의 강의 중 앞 4번은 문제 풀이를 연습하는 것에 초점을 맞추고, 나머지 4번은 앞으로 알고리즘을 더 공부할 때 기반이 될 다양한 분야의 기초적인 지식을 넓게 다루는데 초점을 맞췄습니다.
고인물을 대상으로 가을과 겨울에 고급 스터디도 진행합니다. 여기에서는 접미사 배열, 네트워크 플로우, DP 최적화 등 알고리즘 대회에서 유의미하게 출제되는 고급 알고리즘들을 다룹니다. 강의 준비를 하면서 저도 많이 배우고 있습니다.
강의 자료는 여기에서 확인할 수 있습니다. 많은 관심 부탁드립니다.

이 밖에도 생계유지와 취미 생활에 쓸 돈을 모으기 위해 여기저기에서 강의를 진행했습니다.

마무리

어차피 지키지도 않을 것 같은데 내년 목표를 세워야 할까요? 그래도 안 하면 섭섭하니까 또 적어봅니다.

  • BOJ 10000문제
  • Codeforces 2400(…)
  • SCPC 수상(…)
  • ICPC에서 카이스트 이기고 대학 2등
  • 인턴

BOJ 10000문제는 매우 높은 확률로 달성할 것 같습니다. 코드포스는 또 1년 동안 라운드 한 번도 참여하지 않는 미래가 벌써 보이지만… ㅎㅎ;;
내년에는 꼭 SCPC 수상하고 싶은데 할 수 있을지 모르겠습니다. 또 열심히 공부해 보겠습니다. 지난 2년 동안 ICPC에서 설카숭을 증명했는데, 이번에는 카이스트를 이겨보고 싶습니다. 하지만 이 친구가 버티고 있는 한 쉽지 않을 것 같습니다.
슬슬 밥 벌어먹을 궁리도 해야 할 것 같아서 내년에는 인턴 준비를 해보려고 합니다. 개발 공부도 하고, 전공 과목도 다시 한번 복습하고… 힘든 여정이 될 것 같습니다.

끝!