Good Bye 2023!

서론

컴퓨터를 공부하고 있는 평범한 대학교 3학년 학생이 살아가는 이야기입니다. 흘러가는 대로 살다 보니 벌써 대학교에 입학한 지 3년이나 지났습니다. 고등학생 때나 지금이나 별반 다르지 않은데… 고등학교 졸업보다 대학교 졸업이 더 가깝다는 게 아직은 실감이 나지 않습니다.
올해도 지난 몇 년과 비슷하게 PS 이야기가 대부분을 차지합니다. PS밖에 안 한 걸 보면 발전이 없는 사람처럼 보이지만, 작년에 비해 훨씬 더 다양한 활동을 했으니 조금은 성장했다고 생각합니다.

목차

PC 화면으로 보시는 분들은 오른쪽 사이드 바를 이용해 원하는 문단으로 넘어갈 수 있습니다.

  • 올해 목표 돌아보기
  • 인턴 지원
    • 구글 코리아, SWE 인턴 (23 6~9월)
    • 네이버, ETECH Yorkie 체험형 인턴 (24 1~2월)
    • Jane Street, SWE 인턴 (24 여름)
  • 학교생활 - 강의
    • 1학기 과목
    • 2학기 과목
  • 학교생활 - SCCC
    • 1~5월 - 2023 SCON 개최
    • 3~6월 - 1학기 신입 부원 스터디
    • 6~8월 - 여름방학 기초 알고리즘 강의
    • 9~11월 - 동아리 내전
    • 9~11월 - 2학기 스터디
    • 3~12월 - 동아리 방 활성화
  • Problem Solving
    • 대회 운영
    • 대회 참가
    • 알고리즘 강의
  • 마무리

올해 목표 돌아보기

  • BOJ 10000문제 (성공)
    • 하루에 5문제씩 1년 동안 풀면 8500 → 10000 정도는 쉽게 달성할 수 있습니다.
  • Codeforces 2400 (실패)
    • 코드포스를 안 하는데 레이팅이 오를 리가 없지…
  • SCPC 수상 (실패)
    • 내년에는 받을 수 있을까요? 라는 말을 3년째 하고 있습니다.
    • ICPC, UCPC, 모비스는 상 받았는데 왜 이건 매년 못 받는지 모르겠습니다.
  • ICPC 대학 2등 (실패)
    • ICPC 예선에서 패널티 3분 차이로 KAIST를 이기지 못했습니다. 아쉽다…
  • 인턴 (성공)
    • 2024년 1월 2일부터 2월 23일까지 네이버에서 인턴을 하게 되었습니다!

매년 다양한 목표를 세우지만, 항상 백준 랭작 말고는 달성하는 게 없는 것 같습니다. ‘BOJ 랭작 멈추기’ 같은 목표를 세우면 어떻게 될까요?

인턴 지원

인터넷을 보면 PS만 한 사람은 취업을 못 한다는 이야기가 많이 보입니다. 이런 글을 볼 때마다 조금씩 불안한 마음이 들어서 슬슬 PS와 거리를 두고 먹고 살길을 찾아야 한다고 생각하고 있었습니다.

저는 초등학생 때부터 10년 동안 코드를 짰으며 특성화고 소프트웨어과를 졸업하고 대학교에서도 컴퓨터를 전공하고 있지만, 부끄럽게도 무언가를 만들어내는 “개발”이라는 것을 거의 해본 적이 없고 내세울 만한 프로젝트도 없습니다. 이런 고민 탓에 작년부터 주변 친구들과 선배들에게 조언을 여러 번 구했었습니다.

  • 연합 동아리, 부트캠프, 소프트웨어 마에스트로보다는 인턴 하면서 배우는 게 낫다.
  • 너는 프로젝트가 없어도 실력을 보여줄 수 있는 것이 많으니 괜찮다.
  • 기본적인 것들만 잘 갖춰져 있으면 상관없다.

와 같은 조언을 들었고, 마침 작년 말에 ICPC에서도 큰 성과를 거둔 터라 자신감을 갖고 인턴에 지원했습니다. 사실 자신감이라기보다는 그냥 ICPC 하나만 믿고 도박을 한 것에 가깝습니다. 마치 KOI와 블로그만 믿고 카이스트부터 국민대 숭실대까지 다양한 대학에 수시 원서 8개 넣은 고3 때처럼…

여기에 다 쓰자니 내용이 너무 길어질 것 같아서 간단하게만 적고, 자세한 내용은 결과가 다 나온 이후에 별도의 글을 작성한 다음 이 문단은 지울 계획입니다.

구글 코리아, SWE 인턴 (23 6~9월)

작년에 친구가 올린 글(링크)를 보고 저도 구글 가고 싶어서 지원했습니다. 사실 작년에 2023 목표를 세울 때 인턴을 넣은 것은 구글 인턴을 염두에 두고 작성한 것이었습니다. 원래도 구글은 프로세스가 천천히 진행된다는 것은 알고 있었지만, 제가 직접 겪는 것은 또 다른 문제였습니다. “까먹을 때쯤 연락이 온다”는 표현이 가장 적절한 것 같습니다. 지원한 지 1년 가까이 돼서 자세한 건 기억이 나지 않습니다. 내년에 또 지원할 때 참고하기 위해 날짜 위주로 기록합니다.

1월 12~13일에 채용 공고가 올라왔습니다. 한 가지 문제라면 공고가 올라온 다음 날 구글 12000명 layoff 발표가 나와서… 1월 20일에 공고가 내려갔다가 2월 7일에 다시 공개되는 등 굉장히 정신없었던 것으로 기억합니다.
채용 공고가 공개되자마자 하루 만에 다시 resume와 cover letter등을 작성해서 제출했고, 2월 28일에 코딩 테스트를 보라는 연락을 받았습니다. 코딩 테스트는 2문제가 나왔고, 두 문제를 모두 해결하는데 10분 정도 걸렸습니다. 이후 1달 정도 기다리니 3월 27일에 선호하는 언어와 프로그래밍 언어, 그리고 면접 가능한 시간을 알려달라는 연락이 왔습니다. 서류는 어떻게 합격했으니 이제 면접 준비를 열심히 하면 되겠다고 생각했지만…
5월 18일에 이후 프로세스를 진행하지 않겠다는 연락을 받았습니다. 올해 인턴을 한 사람이 있다는 이야기가 있는 것을 보면 인턴을 아예 모집하지 않은 건 아닌 것 같던데, 그냥 제가 우선순위가 낮았던 모양입니다. 서류 합격했다고 말해야 할지 떨어졌다고 말해야 할지 잘 모르겠습니다. 아무튼 구글 인턴은 탈락했지만, 제 경력(?)이 매력이 없진 않다는 것을 깨닫고 자신감을 얻었습니다.

네이버, ETECH Yorkie 체험형 인턴 (24 1~2월)

네이버는 채용을 안 한다는 소문이 돌길래 카카오 겨울 인턴을 알아봤는데, 카카오는 채용 연계형으로 4학년만 뽑는다고 해서 포기하고 겨울방학에 집에서 뭐 하고 놀지 고민하고 있었습니다. 아무 생각 없이 집에서 누워서 핸드폰을 보는데 우연히 네이버에서 인턴을 모집한다는 소식을 듣고 3일 만에 자소서를 휘갈겨서 제출했습니다.

앞에서도 언급했지만, 인터넷을 보면 PS만 한 사람은 취업을 못 한다는 이야기가 많이 보이고, 보통 이런 글에는 자소서/이력서에 백준 등수 적지 말라는 이야기도 함께 붙곤 합니다. 하지만 저는 당당하게 자소서 문항 3개를 전부 PS로 도배하는 것으로 모자라서, 아예 첫 번째 줄에 BOJ 등수를 적었는데 서류를 붙었습니다. 인터넷에 있는 글은 진지하게 받아들일 필요가 없다는 것을 깨달았습니다. 당연히 이 글도 인터넷에 있는 글이니 진지하게 받아들이진 마세요. 물론 문제 푸는 얘기만 3000글자씩 적은 건 아니고, PS 하면서 상 받은 이야기, PS 하면서 사람 가르친 이야기, PS 하면서 전공과목 날로 먹은 이야기 등등 다양하게 적긴 했습니다.

아무튼 서류는 붙었고, 이제 코딩 테스트를 볼 차례입니다. 3문제 출제되었고 다 푸는데 10~15분 정도 걸렸습니다. 제출 버튼 누르면 채점 결과도 알려주지 않는데 더 이상 코드 수정을 못 하는 게 인상적이었습니다. 코딩 테스트에서 떨어질 일은 없으니 코딩 테스트가 끝나자마자 면접 준비를 시작했습니다. 채용 공고를 보면 자격 요건이 “자료구조, 알고리즘, 프로그래밍언어, OS를 공부한 사람”으로 되어 있습니다. 앞에 있는 2개는 걱정이 없었고 프로그래밍언어론도 크게 걱정되진 않았지만, OS는 조금 걱정이 됐습니다. 동시 작업 편집기를 구현하는 팀인 만큼 동시성 관련된 내용을 물어볼 것 같아서 뮤텍스와 세마포어를 복습했습니다. 또한, Yorkie 팀에서 뭐 하는지 찾아봤더니 splay tree랑 rope 같은 거 사용하는 것 같길래 BBST를 복습하고, 남는 시간에는 “가상 면접 사례로 배우는 대규모 시스템 설계 기초” 책을 조금씩 읽었습니다.

면접은 30분 정도 진행됐는데, 면접 준비하면서 공부한 것은 아무 쓸모가 없었습니다. 자세하게 말할 수는 없지만, 숭실대 특기자 면접보다도 더 편안한 분위기에서 제가 좋아하는 PS와 ICPC 얘기만 잔뜩 하다가 나왔습니다. 상상 속에 있던 회사 면접과는 전혀 다르게, 이게 면접이 맞나 싶을 정도로 신기하게 진행되었습니다. 동아리나 기업에서 사람들 대상으로 강의했던 경험이 큰 도움이 되었습니다. 떨어질 확률보다 붙을 확률이 조금 더 높다고 생각했고, 면접 일주일 정도 뒤에 합격 통보를 받았습니다.

Jane Street, SWE 인턴 (24 여름)

10월에 man_of_learning님의 소개로 Jane Street ETC에 참가했었는데, 대회가 종료된 후에 여름 인턴십을 모집한다는 메일을 받아서 지원하게 되었습니다. 트레이더로 지원하는 건 어림도 없을 것 같고, 그나마 가능성이 있어 보이는 SWE로 지원했습니다. resume는 구글에 냈던 것에 올해 수상 실적을 추가해서 냈고, 3일 뒤에 zoom으로 간단하게 10분 정도 통화하자는 연락을 받았습니다.

영어로 대화하기도 어렵고 낯선 사람과 대화하기도 어려운데 낯선 사람과 영어로 대화하는 것은 얼마나 어려울까요? 일단 저는 많이 어려웠습니다. 학교와 졸업 예정 시기, 그리고 지원 계기와 알게 된 경로 등 간단한 정보를 물어보고 이후 프로세스 일정을 알려주는 간단한 통화였음에도 불구하고, 낯선 사람과 영어로 대화하는 것은 처음이었기에 많이 어려웠습니다. 영어 공부의 필요성을 22년 만에 처음으로 느꼈습니다.

전화가 끝나자마자 첫 번째 인터뷰 일정을 잡자는 메일을 받았고, 바로 1주 뒤에 첫 번째 인터뷰를 진행했습니다. 인터뷰는 1시간 동안 면접관과 1:1로 진행되었습니다. 모든 인터뷰는 한 문제를 여러 단계를 거쳐서 점점 발전시켜 나가는 방식으로 진행됐습니다. 1차 인터뷰는 2개의 단계가 있었는데, 첫 번째 단계는 완벽하게 풀었고 두 번째 단계는 정답에 근접한 답을 냈지만 면접관이 원하는 답과 정확히 일치하지는 않았습니다. 초반에 영어로 대화하는 것이 서툴러서 시간이 지연된 것이 많이 아쉬웠습니다. 붙을 확률보다 떨어질 확률이 조금 더 높다고 생각하고 zoom 회의실에서 나왔습니다.

1주 뒤에 연락이 왔는데, 제 예상과 다르게 긍정적인 평가를 받아서 파이널 인터뷰 기회를 얻게 되었습니다. 파이널 인터뷰는 하루 동안 1시간 정도의 인터뷰를 2~3번 진행하며, 각 라운드를 면접관 2명과 함께 진행합니다. 문제 형식은 동일합니다.

첫 번째 라운드는 오전 11시부터 12시 5분까지 진행됐습니다. 3단계로 구성되어 있었고, 3단계 모두 뇌 비우고 열심히 구현하는 문제라서 어렵지 않게 했습니다. 그게 인터뷰어 마음에 들었을지는 모르겠지만… 마지막에 시간이 조금 남아서 면접관과 잡담할 시간이 있었는데, 하고 싶은 말도 영어로 내뱉지 못하고, 어떻게 잘 영작해서 말하더라도 돌아오는 답변을 다시 해석하는 것이 어려웠습니다. 그래도 영어 공부를 하지 않은 중고등학생 시절의 제가 원망스럽지는 않습니다. 그때 영어 공부했으면 지금 인터뷰를 못 하고 있었을 것이기에…
두 번째 라운드는 12시 10분부터 13시 10분까지 진행됐습니다. 3단계로 구성되어 있었고, 2번째 단계까지는 열심히 구현하는 문제, 마지막 단계는 머리를 조금 써야 하는 문제였습니다. 구현은 잘했고 마지막 단계에서 올바른 아이디어도 냈는데, 인터뷰어의 도움 없이 한 번에 정답에 도달하지 못한 것이 조금 마음에 걸렸습니다. 두 번째 라운드도 잡담할 시간이 조금 있었고, 1시간 만에 영어 실력이 늘진 않기 때문에 이때도 그냥 슬퍼하고 있었습니다.
40분 정도의 점심시간을 가진 후에 13시 50분에 세 번째 라운드를 진행하려고 다시 zoom에 들어갔는데, 인터뷰어가 아닌 리크루터가 들어와서 논의 결과 세 번째 라운드를 진행하지 않는 것으로 결정했다는 이야기를 했습니다. 그리고 파이널 인터뷰도 이렇게 끝이 났습니다.

두 라운드 모두 첫 번째 인터뷰보다는 괜찮았다고 생각하는데, 세 번째 라운드가 취소된 것이 어떤 의미인지 모르겠어서 어떻게 될지 감이 잡히지 않습니다. 문제를 못 풀어서 떨어지진 않을 것 같고, 만약 떨어진다면 영어 때문일 것 같습니다. 이제는 진짜 영어 공부를 해야 할 때가 온 것 같습니다. 붙으면 반년 뒤에 출국해야 하므로 영어 공부를 해야 하고, 떨어지면 영어 때문에 떨어진 것이니 영어 공부를 해야 합니다. 붙든 떨어지든 영어 공부는 해야 합니다. 1차 인터뷰와는 평가 기준이 다를 것 같기 때문에 떨어질 확률이 붙을 확률의 2배 정도 된다고 생각하고 있습니다.

밖에서 노트북으로 문제 풀 때 배터리를 아끼기 위해서 IDE 대신 메모장(notepad.exe)에서 코드를 작성하는데, 이 경험은 자동 완성 안 되는 색깔 있는 메모장에서 코드 실행 없이 눈으로만 검사하는 인터뷰에서 이 경험이 아주 큰 도움이 되었습니다.

결과는 다음 주 정도에 나온다고 하는데 과연…

학교생활 - 강의

전공과목들은 작년(2학년)에 비해 전체적으로 재미없었습니다. 형식언어와 오토마타, 문제해결 같은 과목 듣다가 파일처리랑 웹프로그래밍을 들으면 누구나 그렇게 생각하지 않을까요? 일단 저는 그랬습니다. 강의 듣는 게 너무 재미없어서 강의 시간에는 BOJ 랭작을 열심히 했었고, 대신 강의 자료 다운로드받아서 집에서 혼자 공부했습니다. 혼자 공부하면 재미있던데 왜 강의실에만 앉아있으면 흥미가 뚝 떨어지는지 모르겠습니다. 중요한 과목에서는 나름 좋은 성적을 받았으니 괜찮은 것 같습니다.

1학기 과목

전공과목은 프로그래밍언어, 네트워크프로그래밍, 파일처리, 오픈소스기반고급설계를 수강했고, 수학과 전공과목인 조합론도 함께 들었습니다.

조합론은 PS 공부하려고 신청한 과목이었습니다. 정수론과 조합론은 PS 하면서 영재고 → 서울대/카이스트 루트를 탄 학생들에 비해 가장 크게 뒤쳐진다고 느낀 분야였습니다. 작년 2학기에 정수론, 올해 1학기에 조합론을 수강한 것은 모두 그 격차를 조금이라도 줄여보기 위함이었습니다. xMO에 나올 법한 신박한 카운팅이나 AtCoder에 자주 등장하는 생성함수 같은 것을 배우고 싶어서 조합론을 신청했지만…
교수님께서 수학과 4학년이면 취업 생각을 해야 한다면서 갑자기 중간고사 이후부터 머신러닝을 가르쳐주셨습니다. 기대했던 내용을 배우지는 못했지만, 중간고사는 중학생 때 KOI 지역 예선 공부하면서 봤던 내용, 기말고사는 중학생 때 혼자 머신러닝 공부하던 내용으로 모두 커버돼서 성적은 잘 나온 과목입니다.
프로그래밍언어는 1학기에 배운 과목 중 가장 재미있는 과목이었습니다. 지난 학기에 오토마타 과목에서 배운 Context Free Grammar를 이용해 C언어 문법을 표현하는 방법에 대해 한 학기 동안 배웠고, 그 과정에서 교수님의 지도 덕분에 재귀적으로 정의된 개념을 엄밀하면서도 쉽게 설명하는 방법에 대해 배웠습니다. 학생들은 별로 안 좋아하는 것 같았지만, 사람들을 가르치는 일을 하는 저에게는 큰 도움이 되었습니다. 시험공부는 별로 안 했지만, 강의를 다른 과목에 비해 재미있게 들은 덕분인지 꽤 좋은 성적을 받았습니다.
네트워크프로그래밍은 별로 기대하지 않고 신청했는데 생각했던 것보다 재미있었고 과제도 유익했습니다. 강의 들을 때는 대충 당연한 이야기를 하는 것 같아서 잘 듣지 않았었는데, 네이버 인턴 면접 준비하면서 열심히 듣지 않은 것을 많이 후회했습니다. 이 글을 읽고 있는 숭실대학교 컴퓨터학부 1~2학년 학생이 있다면 3학년 때 꼭 열심히 들으시길 바랍니다.

다른 두 과목은 별로 할 이야기가 없습니다.

2학기 과목

전공과목은 운영체제, 컴퓨터비전, 인공지능, 컴파일러, 웹프로그래밍설계및실습을 수강했고, 수학과 전공과목인 집합론도 함께 들었습니다.

운영체제는 졸업 해야 돼서 들었습니다. 과제 4개 중에 2개 초과로 fail 하면 F 준다고 해서 과제 열심히 했더니 A+을 받았습니다(?). 알고 보니 과제 4개를 온전히 구현한 학생이 저 포함해서 2명밖에 없었습니다. 교과서는 OSTEP(링크), 과제는 xv6(링크)를 사용했습니다. 과목에서 배운 내용 중에 인상 깊었던 건 별로 없었는데, 대신 교과서를 읽으면서 많이 감탄했었습니다. 운영체제의 대가가 집필한 교과서답게 책이 정말 잘 쓰여 있어서, 강의 시간 내내 BOJ 랭작만 한 사람도 한 번 읽으면 모두 이해가 되도록 작성되어 있었습니다. 또한, 개념과 개념 사이의 연결도 매끄럽게 작성되어 있었습니다. 덕분에 시험 이틀 전에 시험공부는 안 하고, 대신 알고리즘 책을 작성하고 싶다는 오만한 꿈을 꾸던 저를 되돌아보고 있었습니다.
컴퓨터비전은 2학기에 들은 과목 중 가장 재미있는 과목이었습니다. 대부분의 개념이 PS, 특히 계산 기하를 공부하면서 한 번 이상 봤던 컨셉/개념이었고, 심지어 이 과목에서 배운 것들만 사용해서 풀 수 있는 문제들로 문제집(링크)도 만들 수 있을 정도였습니다. 같이 들은 학생 중에 동의하는 사람이 얼마나 있을지는 모르겠지만… 아무튼 재미있었고 성적도 잘 나왔습니다.
인공지능은 컴퓨터학부 전공과목으로 3-2 인공지능, 4-1 머신러닝, 4-2 딥러닝이 있길래 맨 앞에 있는 인공지능은 날먹 과목일 것 같아서 수강했습니다. 중학생 때 혼자서 공부한 내용, 1학기에 조합론 강의에서 배운 내용, 2학기에 컴퓨터비전 강의에서 배운 내용으로 모두 커버할 수 있어서 편했습니다.
컴파일러는 매우 유익했지만 제가 많이 부족한 과목이었습니다. 과제는 총 6개 나왔고 그중 4~6번째 과제가 각각 syntax analyzer, semantic analyzer, C compiler 제작이었는데, 4번째 과제 마감과 ICPC Seoul Regional Contest가 겹치는 바람에 4번째 과제와 그 이후 과제를 하나도 하지 못했습니다. 시간 날 때 다시 공부할 계획입니다.

다른 두 과목은 별로 할 이야기가 없습니다.

학교생활 - SCCC

올해 1월부터 회장 인수인계를 시작해서 1학기 시작할 때쯤 chansol(링크)에게 회장을 넘기고 저는 부회장과 총무를 겸하게 되었습니다. 하지만 2학기 때 모종의 사유로 제가 다시 회장을 넘겨받게 되었고, 총무를 넘겨받을 후임자도 찾지 못해서 회장 업무와 총무 업무를 모두 혼자서 처리하는 중노동에 시달리게 되었습니다.

학교가 대면으로 완전히 전환됨에 따라 SCCC도 작년에 비해 많은 행사를 했습니다. 1학기는 SCON 개최, 여름방학은 기초 알고리즘 강의, 2학기는 동아리 내전에 가장 많은 시간과 노력을 투자했습니다. 이 밖에도 스터디를 대면으로 전환하고 새로운 형태의 스터디를 진행한 것, 동아리 방을 활성화한 것도 큰 성과입니다. 작년에는 저 혼자 모든 스터디를 진행했는데 올해는 의도적으로라도 다른 분들에게 강의를 나눠준 것도 개인적으로는 큰 변화라고 생각합니다.

개인적으로 갖고 있는 성공적인 스터디의 기준은 “한 시즌의 끝까지 따라오는 학생이 1명 이상 존재하는 것”입니다. 올해는 총 3번의 스터디를 진행했는데, 매번 끝까지 따라오는 것을 넘어서, 혼자서 더 많이 공부하고 질문하는 등 아주 열심히 하는 학생을 1명 이상 발견해서 올해 스터디는 매우 성공적이라고 생각합니다.

1~5월 - 2023 SCON 개최

3시간의 대회를 위해 4달을 준비했습니다. 대회 개최 후기는 (여기)에 이미 잘 적어놓았으므로 더 이야기하진 않겠습니다. 제가 올해 블로그에 올린 글 중에서 가장 많은 공을 들인 글이니 한 번씩 읽어주시면 감사하겠습니다.
이제 슬슬 내년 대회도 준비해야 하는데… 일단 Good Bye BOJ 2023! & Hello BOJ 2024! 부터 잘 마무리 짓고 생각하겠습니다.

3~6월 - 1학기 신입 부원 스터디

작년 1학기 때 신입 부원을 선발하고 기초 알고리즘 강의를 진행했을 때, 강의를 제대로 들은 부원이 3명 정도밖에 되지 않았었습니다. 앞에서 설명만 하고 끝내는 방식의 강의는 너무 비효율적인 것 같아서, 1학기 신입 부원 스터디는 강사 1명이 학생 3~5명을 담당하는 소규모 그룹 스터디로 진행했습니다. 구체적으로, 1학년 신입생들을 가르치는 C언어 문법 그룹 4개, 2학년 이상 학생들이 solved.ac CLASS 3~5를 딸 수 있도록 도와주는 클래스 그룹 4개를 만들어서 진행했습니다.

부원들의 참여도나 개인적으로 오는 질문의 빈도를 봤을 때, 작년에 비해 훨씬 성공적이었다고 생각합니다. C언어 그룹 참가 학생 중에 반년 넘게 solvedac 스트릭을 잇는 학생도 있고, 클래스 그룹 참가 학생 중에 꾸준히 질문하면서 어려운 알고리즘도 공부하는 학생도 몇 명 있는 것을 보면 그룹 스터디를 진행하길 참 잘한 것 같습니다.

2학기에도 비슷하게 진행하고 싶었지만, 강사를 8명씩 구하는 것이 너무 어려워서 2학기에는 다시 단체 강의로 돌아갔습니다. 2학기는 ICPC가 있어서 강사들에게 시간을 내어달라고 부탁하기가 어려운 것도 영향이 있었습니다. 아마 내년 1학기에는 다시 그룹 방식으로 돌아갈 것 같습니다.

6~8월 - 여름방학 기초 알고리즘 강의

여름방학에 6주 동안 매주 2번씩 오후 2시부터 6시까지, 총 48시간 동안 기초 알고리즘 강의(링크)를 진행했습니다. 코딩테스트에 나오는 모든 범위, 그리고 코드포스 오렌지를 찍는 데 필요한 모든 개념을 전부 커버하는 것이 목표였습니다. 강의를 준비할 때 제가 중점적으로 고려한 것은 아래 2가지입니다. 시중에 돌아다니는 알고리즘 강의 자료가 모두 마음에 들지 않아서 제가 원하는 구성으로 처음부터 끝까지 직접 강의 자료를 제작했습니다.

  • 개념의 직관적인 이해, 증명, 문제 풀이를 모두 다룸
    • 학부 알고리즘 강의는 문제 풀이를 거의 다루지 않음
    • 대부분의 코딩 테스트/알고리즘 대회 강의는 문제 풀이를 제외한 부분을 제대로 다루지 않음
  • 비트 연산, C++ 표준 라이브러리의 내부 구현, 상수 커팅 등 경험하지 않으면 알기 어려운 내용도 다룸
    • 너네는 제발 이런 걸로 삽질하지 말아라…
    • 이런 거 안 가르쳐 주면 BOJ 랭커한테 배우는 이유가 있나?

한 번에 4시간씩 강의를 했지만 실제로 설명하는 시간은 1.5 ~ 2시간 정도였고, 남은 시간은 강의실을 돌아다니면서 코드에 훈수 두고 질문을 받았습니다. 단순히 앞에서 개념과 문제 풀이만 설명하고 끝내는 강의가 별로 좋지 않다는 것은 작년에 깨달았기 때문에, 강의실에 앉아있는 시간만이라도 제발 문제를 본인의 힘으로 직접 풀었으면 해서 이렇게 진행했습니다. BOJ 그룹 연습 스코어보드가 이쁘게 나온 것을 보면 나름대로 효과가 있었던 것 같습니다.

하지만 너무 많은 연습 문제에 부담을 느껴서 중도 하차를 하거나, 한 번 결석한 이후로 진도를 따라가지 못한 학생이 여러 명 있었습니다. 다음에 또 이런 형태의 강의를 진행하게 된다면 필수 문제와 심화 문제로 나누고, 강의 시작할 때마다 지난 시간 내용을 리뷰하는 등의 변화를 주는 게 좋을 것 같습니다.

6~8월 - 문제 출제 강의

2학기에 동아리 내전을 열기 위해 야심 차게 준비한 스터디(링크)였지만… 제가 계절학교와 대회 운영 등으로 스터디에 시간을 쓰지 못해서 실제 문제 출제까지는 이어지지 못했습니다. 지금까지 제가 출제했던 문제들을 활용해서 문제 지문, generator, validator, checker를 올바르게 작성하는 방법에 대해 가르치는 스터디였습니다. 참가자들의 열정을 제가 따라가지 못해서 죄송할 따름입니다.

9~11월 - 동아리 내전

1학기에 가장 많은 시간과 노력을 투자한 행사가 SCON이었다면, 2학기는 동아리 내전이었습니다. 직접 문제를 만들어서 내전을 개최한다는 원대한 꿈은 이루지 못했지만… 대신 여름방학 동안 kyo20111와 함께 러시아 문제를 풀면서 모은 1~2명만 해결한 좋은 문제들을 이용해 내전을 개최했습니다. 많은 사람이 참가해서 알고리즘 대회의 즐거움을 알아갔으면 하는 마음으로 상품을 푸짐하게 준비했지만, 3번의 내전 모두 참가자 수가 상품의 개수를 넘지 못하는 참사가 발생했습니다. 그래도 참가했던 분들은 다들 재미있게 문제를 푼 것 같아서 다행입니다. 문제는 (여기)에서 확인할 수 있습니다.

ICPC 예선 직전에는 3인 1팀 형태의 내전도 진행했습니다. 최대한 대회와 유사한 환경을 제공하기 위해서 DomJudge 서버를 구축하고, 해외 리저널 예선 문제(링크)를 가져와서 쉬운 문제 몇 개 번역(링크)해서 제공하고, 외부 공간을 대여해서 진행했습니다. 문제 셋을 잘못 선정해서 조금 구데기 같았던 것을 빼면 나름 괜찮게 굴러갔던 것 같습니다.

개인 대회와 팀 대회 모두 내년에도 진행하고 싶지만, 대회를 열 수 정도로 문제를 모으지 못할 것 같아서 걱정입니다. 방학 동안 열심히 모아야지…

9~11월 - 2학기 스터디

2학기에는 기본적인 알고리즘 개념을 배울 수 있는 기초 알고리즘 강의, 기초 알고리즘 강의에서 배운 내용으로 다양한 문제를 해결하는 기초 알고리즘 연습, 기초보다 조금 더 어려운 solved.ac 기준 P5~P3 정도의 개념을 배울 수 있는 중급 알고리즘 강의까지, 총 3개의 오프라인 강의를 진행했습니다. 기초 강의와 기초 연습은 여름방학에 사용했던 자료를 기반으로 진행했으며, 기초 연습은 강사가 아닌 수강생들이 돌아가면서 각자의 풀이 방법을 주고받는 형태로 진행했습니다. 중급 강의는 작년 겨울에 진행했던 중급 강의 자료에 계산 기하 내용을 추가해서 진행했습니다.

기초 연습은 끝까지 따라온 부원과 그렇지 않은 부원의 차이가 매우 컸는데, 끝까지 따라온 분들은 매우 만족해하시는 것 같았습니다. 다만 서로 풀이를 토론하는 방식은 참가자들이 시간을 더 많이 투자할 수 있는 방학에 진행하면 더 좋을 것 같다는 피드백을 받았습니다.

중급 강의는 강의를 1번 진행할 때마다 그룹 연습 스코어보드에 뜨는 핸들이 대략 절반씩 없어져서 슬펐습니다. 다들 과제에 치여서 사느라 그런 것 같습니다. PS보다는 학교 강의가 중요하긴 하지… 그래도 끝까지 따라온 사람이 3명이나 있는 것을 보면, 제가 SCCC를 떠나더라도 소모임이 잘 유지될 수 있을 것 같다는 생각이 듭니다.

3~12월 - 동아리 방 활성화

사실 동아리 방이라고 부르기도 뭐한 공간이긴 하지만… 1년 동안 많은 변화가 있었습니다.

작년까지는 비좁은 공간에 책상 6개, 의자 7개, 고장 난 컴퓨터 5대, 윈도우 7이 깔린 컴퓨터 1대, 한 10년은 됐을 것 같은 모니터 1n개가 들어가 있는 삭막한 공간이었습니다. 사람들이 알고리즘에 재미를 붙이는 것보다는 동아리 방에서 사람들과 친해져서 자연스럽게 문제를 풀도록 하는 게 더 빠를 것 같아서, 사람들이 많이 오도록 유도하기 위해 많이 갖다 버리고 새로운 물건을 새로 사서 채워 넣었습니다.

일단 모든 컴퓨터 본체와 모니터를 갖다 버리는 것부터 시작했습니다. 의자도 2개 버리고 책상 배치를 변경한 다음, 전선 몰딩을 사서 직접 시공도 했습니다. 65w 충전기와 C to C 케이블, 라이트닝 케이블, 모니터 거치대, 담요 등은 현대모비스의 후원을 받아서 구매했습니다. 이렇게 해서 1학기에는 책상과 충전기가 있는, 공강 시간 때우기에 적합한 공간으로 만들었습니다. 덕분에 작년에는 1비트로 표현할 수 있었던 동아리 방 사용 인원은 무려 2비트로도 표현할 수 없을 정도로 커졌습니다.

2학기에는 현대 모비스의 후원을 받아 27인치 모니터와 모니터 암을 구매했습니다. 이제는 평일 오후 10시나 주말에 가더라도 3명 이상의 사람이 있으며, 실제 사용 인원은 5비트로 표현해야 할 정도로 많아졌습니다. 이렇게 사람이 모이다 보니 서로 solved.ac 레이팅이나 스트릭으로 경쟁하는 등 제가 원래 기대하던 효과도 나타나기 시작했습니다.

Problem Solving

이 블로그의 메인 콘텐츠입니다. 작년보다 더 다양한 경험을 했습니다.

대회 운영

올해는 작년이나 재작년만큼 대회를 많이 운영하진 않았지만, 임팩트가 큰 대회를 여러 개 운영했습니다. 기억할 만한 대회는 이미 장문의 후기를 남겼기 때문에, 지금은 그냥 간단하게 코멘트만 남겨보려고 합니다.

한국 정보 올림피아드(KOI) 운영진이 되었습니다. 고등학생 때 KOI 1차 대회에서 비버 챌린지 문제를 풀면서 이런 기능은 도대체 누가 작업하는 건지 궁금했었는데, 4년 만에 그 궁금증을 해결했습니다. 제가 만들고 있더라고요. 비버 챌린지도 작업하고 실기 문제도 세팅하고 검수도 하고… 많이 힘들었지만 그만큼 재미있었습니다. 자세한 이야기는 쓰기 귀찮으니까 생략.
넥슨 청소년 프로그래밍 챌린지(NYPC) 운영진이 되었습니다. KOI와 비슷하게 많이 힘들고 많이 재미있었고 자세한 이야기는 쓰기 귀찮습니다.
숭실대학교 프로그래밍 대회(SCON)의 개최 후기는 (여기)에서 볼 수 있습니다.
선린인터넷고등학교 교내 대회도 3년째 개최하고 있습니다. 이제 슬슬 손을 놓을 때가 된 것 같아서 올해는 의도적으로 대부분의 작업을 후배들에게 넘겼습니다. 내년에는 검수진 구하는 것을 제외하면 대회 운영에 관여하지 않을 예정이고, 그 이후에는 아예 손을 떼려고 합니다. 그래도 후배들에게 넘겨주기 전에 인건비는 올려주고 떠나고 싶어서 학교와 많은 대화 끝에 출제/검수 예산을 증가시켰습니다. 3년 했으면 많이 했다…
고려대학교, 성균관대학교, 서울대학교 교내 대회 출제/검수에도 참여했는데 잘 기억나지 않습니다.

KOI와 NYPC 출제는 중고등학생 때부터 어렴풋이 꿈꿔왔던 일이지만 저에게는 기회가 오지 않을 것 같았는데, 주변 사람들의 도움과 엄청난 행운 덕분에 기회를 잡을 수 있었습니다. PS 열심히 하길 정말 잘한 것 같습니다. 코로나 걸린 상태로 KOI 1차 대회와 SCON을 동시에 준비할 때 쓴 일기를 보면 힘들어 죽을 것 같다는 내용으로 도배되어 있던데, 지금은 즐거웠던 기억만 남아있는 걸 보니 사람은 추억을 먹고 산다는 어른들의 말씀이 이제야 이해가 됩니다.

대회 참가

대회 참가도 간단한 코멘트만 남깁니다.

ICPC World Finals
에 참가할 예정이었지만 이스라엘-하마스 전쟁 때문에 대회가 연기되었습니다. 내 공짜 이집트 여행을 돌려줘…

현대 모비스 알고리즘 경진대회
에 참가하고 싶었지만, 상 2번 받았다고 밴 당해서 못 나갔습니다. 내 아이패드를 돌려줘…

SCPC
“내년에는 상 받겠지?” 를 3년째 반복하고 있습니다. 본선에서 상 못 받은 건 그냥 실력 부족이라고 생각합니다. 1차 예선 풀이와 후기는 (링크)에서, 2차 예선 풀이와 후기는 (링크)에서 확인할 수 있습니다.

UCPC/ICPC
UCPC는 3년 만에 특별상이 아닌 등수에 따른 상을 받았습니다. ICPC는 금상을 받고 싶다는 욕심이 있었지만… 아쉽게도 작년과 동일하게 5등 해서 은상을 받았습니다. 후기는 (링크)에서 볼 수 있습니다.

한양대학교 ERICA x 코드트리 프로그래밍 경진대회
특별상이 많이 걸려있다고 해서 특별상 노리고 첫 1시간 동안만 문제 풀었는데… 대학생부에서 1등 해서 아이패드 + 에어팟 + 스타벅스 기프티콘을 받게 되었습니다. 제가 아무도 모르는 대회 조용히 나가서 1등 하는 건 좀 잘하긴 합니다(참고 링크).
일반부 1등과 고등부 1등이 저보다 등수가 높았는데, 한 학기만 일찍 열렸으면 일반부 1등이 대학생이라서 졌을 것이고, 한 학기만 늦게 열렸으면 고등부 1등이 대학생이라서 졌을 것입니다. 인생은 타이밍입니다.

알고리즘 강의

국제정보올림피아드 계절학교에서 코치로 일했습니다. 분명 고등학생 때 봤던 계절학교 코치님들은 엄청 어른인 것 같고 무게감(그 무게 아님ㅎ) 있는 실력자분들이었는데, 왜 올해 코치장까지 한 저는 그냥 한없이 가벼운(저체중 맞음) 잼민이 같은 건지… 5년 전에 처음반 겨울학교도 떨어질 정도의 실력을 갖고 있었는데 이 자리까지 올라온 것을 보면 참 신기합니다. 제가 열심히 공부한 것도 있지만, 그것보다는 타이밍과 운, 그리고 주변 사람들의 도움 덕분이라고 생각합니다. 고등학생 때 꿈꾸던 KOI 출제, NYPC 출제, 계절학교 코치까지 모두 이뤘으니 이제 새로운 목표를 정할 시기가 다가온 것 같습니다.
계절학교 코치에 대해서 조금 이야기하자면… 고등학생 때 실습 시간에 풀지 못했던 문제를 3~4년 만에 다시 보고 푸는 것이 가장 즐거웠고, 저보다 똑똑하고 열심히 공부하는 학생들을 가르치는 것도 매우 재미있었습니다. 여름학교에서는 처음반 오전 강의 하나를 교수님 대신 제가 진행했으며, 그때 사용한 강의 자료는 (여기)에서 볼 수 있습니다. 선린 정올반이나 SCCC에서는 가르칠 수 없는 내용까지 마음껏 가르칠 수 있어서 좋았습니다.

선린인터넷고등학교 정보올림피아드반 강의는 3년째 하고 있습니다. 대부분의 수업에 학생이 1명만 나와서 사실상 과외 형식으로 진행되었습니다. 그 학생은 배우고 싶은 걸 배울 수 있고, 저는 기초 내용 전부 생략하고 재미있는 거 가르칠 수 있으니 윈윈이라고 생각합니다. 아마도? 다만 고등학생 때 알고리즘을 열심히 공부했던 학생으로서, 후배들이 더 이상 PS에 관심을 갖지 않는 것은 매우 아쉬운 일이라고 생각합니다. 입시 트랜드가 바뀌었으니 어쩔 수 없는 일이긴 합니다…
매년 12월에 열리는 선린 알고리즘 컨퍼런스에는 삼고초려 끝에 어렵게 모신 rkm0959, jwvg0425, ryute님들과 함께 영업했는데 효과가 있을지는 모르겠습니다. PS 영업과는 별개로 연사로 오신 분들께서 해주신 이야기는 어디서도 들을 수 없는 귀한 경험담이라고 생각해서, 기회가 된다면 내년에 SCCC에서도 비슷한 형태의 행사를 추진해 보려고 합니다.

숭실대학교 문제해결 소모임 SCCC에서도 강의했습니다. 대부분의 이야기는 위에서 했으니 그냥 넘어갑니다. 강의 자료는 (여기)에서 볼 수 있습니다.

마무리

어차피 지키지도 않을 것 같지만 일단 또 목표를 세워봅시다.

  • ICPC World Finals 한 번 더 진출
  • SCPC 수상(…)
  • Codeforces 2400(…)
  • ICPC Seoul Regional Contest 출제

사실 가장 크고 급한 목표는 1월 2일부터 8주 동안 진행되는 네이버 인턴을 성공적으로 마치는 것입니다. 첫 직장 생활이라 두려우면서도 설렙니다. 제 인생이 늘 그랬듯이 흘러가는 대로 살면 어떻게든 될 거라는 생각으로 매 순간 최선… 까지는 아니고, 그냥 적당히 열심히 하려고 합니다.

2/29 ~ 3/3에는 2024 ICPC World Finals의 티켓을 두고 아시아 태평양 지역의 대학이 경쟁을 펼치는 2024 ICPC Asia Pacific Championship(링크)이 개최됩니다. 서울 리저널에서 1순위로 진출한 만큼 꼭 진출 티켓을 따고 싶습니다. 2년 동안 함께 ICPC에 참가했던 edenooo가 이제 졸업하는데, edenooo 없이는 WF 진출이 어려울 것 같아서 이번에 WF 진출 2번 채우고 기분 좋게 ICPC에서 은퇴하는 것이 목표입니다.

ICPC 출제는 하고 싶다고 할 수 있는 게 아니긴 한데 일단 넣어봤습니다. ICPC 은퇴에 실패하면 한 번 더 ICPC 참가는 할 생각이라서, 일단 플레이오프를 잘 치고 다시 생각하는 걸로… SCPC랑 코드포스 레드는 몇 년째 목표에 있는지 모르겠습니다.

내년에는 또 어떤 일이 벌어질지 궁금하고 기대되면서도, 이제 슬슬 진로를 정해야 할 시기가 온 것 같아서 참 고민이 많습니다. 어떻게든 흘러가지 않을까요?

끝!