대학교 1학년 2학기의 정중앙을 지나고 있을 무렵, 새내기 컴공생이었던 우리에게 그 어떤 기초 학습도 없이 꽤 어려운 알고리즘 문제를 내어 주었다.
Dynamic Programming을 이용하여 푸는 문제였으나, 그 사실을 이제 C언어와 전기회로를 끄적거리고 있던 내가 알 수 있을리가 없었다. 그렇게 피같은 절망을 맛보고 난 후, 같은 학술 동아리에 속해있던 S/W 특기자 동기가 프로젝트 오일러 라는, 수학 문제를 프로그래밍으로 해결하는 사이트를 내게 추천해 주었다.
고등학교 수학에서 느꼈던 그 짜릿함을 기억하며, 그 자리에서 바로 북마크한 뒤, 학교 근처 스터디룸에서 기대에 차 사이트를 접속했다. 이것이 내가 알고리즘 트레이닝을 시작하게 된 계기이다.
대학교 1학년 2학기가 지나고, 알고리즘 공부 사이트를 오일러 프로젝트에서 문제의 양이 많고, 코드 채점이 가능한 백준으로 옮겼다. 그리고 내가 가는 곳 어디든 노트북을 들고 다니며, 못 푼 문제를 해결하기 위한 아이디어가 떠오를 때 마다 노트북을 꺼내어 타이핑 하곤 했다.
그리고 약 2년 가까이 지난 2022년 2월 경, 더 이상 알고리즘 공부가 즐겁지 않았고, 그저 괴롭기만 했다. 어떤 문제를 해결하지 못한다는 것 자체에 큰 좌절감을 느끼고, 결과를 단순히 Solved / Unsolved 라는 이분법 적으로 받아들였다.
나는 고등학생 때 알고리즘이라는 키워드가 수학으로 바뀌었을 뿐 이와 똑같은 경험을 한 적이 있다. 그때 이와같은 번아웃을 극복하며 느낀 것은 수학을 풀며 단순히 답을 내는 것에서 쾌감을 느끼는 것 보다, 그보다 더 깊게 배워 내가 수학 문제를 해결하는 과정에 스스로 피드백을 부여하며 성장하는 것이 더 즐겁다는 것을 깨닳았다.
이러한 경험을 바탕으로 많은 커뮤니티에서 "컴퓨터 공학자라면 반드시 읽어봐야하는 책" 이라고 불리우는 The Art of Computer Programming (저자. 도널드 커누스) 라는 책을 알게 되었고, 곧바로 vol.1 과 vol.2 를 주문하였다.

사진: https://www-cs-faculty.stanford.edu/~knuth/taocp.html
TAOCP의 후기들의 공통적인 반응은 "어렵다" 였다.
'어려우면 얼마나 어렵다고' 라고 오만했었지만, 책에 있는 문제 대부분을 풀지 못함을 깨닫고 나서는 매우 겸손해질 수 밖에 없었다.
TAOCP는 답을 얻어내는 과정에 큰 중심을 잡고 있는 느낌이었다.
이러한 느낌을 가지게 해준 가장 큰 요소가 답지의 해설이 문제의 길이보다 짧거나 같은 경우가 많았다는 것이다 (물론 해설이 정말 긴 문제도 있었다).
하지만, 이렇게 짧은 해설에도 문제를 풀어가는 나에게 충분한 피드백을 제공해줄 수 있었는데, 바로 문제 간에 유기적으로 연결되어 사고를 확장시키도록 하는 방식 덕분이다.
사실 저자의 의도가 이게 맞는지는 잘 모르겠다.
이 책의 각 단원에서 개념부는 해당 주제에 대해 기본 원소와 같은 개념과 정리들을 설명한다. 그리고 그 문제의 초반부에서는 해당 개념들을 가지고 새로운 정리를 증명해내고, 그렇게 얻어낸 정리(혹은 정리를 하며 얻어낸 증명과정)를 가지고 또 하나의 정리를 얻어낸다.
즉, 최종적으로 C 라는 정리를 이끌어내기 위해 정리 A -> 정리 B -> 정리 C 의 과정을 거치며, 정리 A 와 정리 B 를 증명하는 과정, 그리고 각 정리를 다음 정리에 활용하는 과정에서 정리 C 를 얻기 위한 피드백들을 얻을 수 있었던 것이다.
개인적으로, 증명에 있어 가장 중요한 것이 방향성이라 생각하는데, 위와같은 과정에서 얻어내는 수많은 피드백이 이러한 방향성에 큰 도움이 되는 것 같다.
당연하게도, 이는 알고리즘 공부에서도 적용되기에 새로운 알고리즘을 학습할 때나 내가 작성한 알고리즘의 타당성을 증명하는데에도 큰 도움이 되었다.
요즘들어 알고리즘 트레이닝을 할 때면, 어떠한 문제를 엄밀히 풀어내는 것에 큰 흥미를 느낀다.
이전엔 문제 해결에 대한 아이디어가 생각나면, 일단 코드부터 작성했는데, 이젠 타당성이 어느정도 엄밀히 증명되기 전까진 코드를 작성하지 않는다.
그 덕에 알고리즘 트레이닝을 하는 중엔 키보드 보단 펜을 잡고있는 시간이 더 많아졌다.
지금와서 돌아보면, 이전까지 내가 알고리즘 트레이닝을 할 때, 너무 쫓기듯 문제들을 해결하려고 했던 것 같다. 컴퓨터 공학을 접한지 얼마 안된 나는 우매함의 봉우리에 빠져 과도한 자만에 취해있었고, 그 자만심을 채우기 위해 정답을 맞히지 못하면 좌절하는 그 과정에 너무 괴로웠지 않았나 싶다. 그래서 어쩌면, 지금의 난 겸손히, 그리고 차분히 문제를 해결하는 방법을 배운 것 같기도 하다.
앞으로 TAOCP는 전권 학습을 목표로 계속 읽어나갈 것이다.
그러나 TAOCP 라는 책이 어렵고, 양도 상당해서 전권을 다 읽기엔 시간이 정말 많이 필요할 것 같아 수학의 정석 처럼 틈틈히 꺼내보며 오랜기간 학습하려고 한다.
이러한 과정을 겪으며, 앞으로 겪을 번아웃과 슬럼프 등의 나 스스로에게 부딪히는 많은 고난을 마주하게 되면, 우선 "올바른 피드백을 얻을 수 있는 방법이 무엇인지" 부터 고민할 것 같다.
그리고 아마 그 방법을 찾기 위한 첫 질문은 "내가 하는 것에 대해 다시 즐거움을 느낄 수 있는가?" 일 것이다.
혹시 완독하셨다면 한 권 읽는 데에 얼마나 소요되셨는지 여쭐 수 있을까요??