DEV Community

Cover image for 10년을 함께한 BOJ와 나의 이야기.
Chan
Chan

Posted on

10년을 함께한 BOJ와 나의 이야기.

수학을 못하는 아이

나는 항상 수학을 못했다. 학년이 바뀌어도, 학교가 바뀌어도 받아든 수학 성적표는 항상 처참했다. 유종의 미라는 말이 전혀 어울리지 않게 수능 수학에서 6등급을 받았다. 수학에서 해방되나 싶은 찰나, 대학에서 수학은 '알고리즘'이라는 단어로 변신하여 다시 나를 괴롭히기 시작했다. 알고리즘 문제 풀이를 위주로 하는 알고리즘응용 과목에서 학점 C를 받았다. 교내 알고리즘 동아리에서 개최한 프로그래밍 대회에서 꼴등을 차지하여 부끄러움에 고개를 들지 못했던 기억도 있다. 입사 및 취업 준비를 위해 지원했던 네이버 부스트캠프, EA코리아, 크래프톤, 카카오페이, 네이버 입사 코딩테스트에 탈락했다.

수학과 알고리즘은 항상 내 인생을 가로막는 바운더리였다. 서서히 축적된 실패는 서서히 이론화되어 더이상 내가 알고리즘을 잘할 수 없다는 믿음으로 빠지게 만들고 있었다. 밧줄에 묶인 코끼리처럼 해가 갈수록 발버둥치는 빈도도 줄어들어 코딩테스트를 대비해야겠다는 의지도 거의 꺾을 즈음이었다.

다시 살아난 작은 불씨

코딩테스트를 대부분 통과했고 지금은 좋은 기업에 다니는 동기는 어느날 지인들을 알고리즘 특강을 열었다. 일주일에서 이주일 간의 짧은 특강이었지만 나에게는 굉장히 특별한 경험이었다. 문제를 맞히는데 가치를 두는 게 아닌, 최대한 많은 아이디어를 시도해보고 검증하는 과정에 칭찬을 해주었다. 문제를 풀지 못하더라도 최대한 많은 아이디어를 제시하고 이게 제대로 될지 생각해보는 과정이 재미있었다. 이 때 알고리즘에 대한 거부감이 사라지고 친해지게 되기 시작한 거 같다. 비록 이 기간 동안 계약직으로 근무를 하고 있어서 항상 특강에 참여를 하기는 힘들었지만 꺾였던 의지가 다시 펴지기에는 충분한 기회였다.

계약 만료날 받은 피드백

계약직이 해지되는 당일날 리드 개발자로부터 과제에 대한 피드백을 받았다. 기초적인 데이터 모델링 실력이 부족하다는 것이었다.

바로 이때, 특강을 해줬던 친구의 말이 오버랩되었다. 상태공간을 잘 정의하고 가능한 상태들을 모두 탐색하는 '상태 설계'를 잘해야 코딩테스트를 잘 볼 수 있다고. 지금까지는 채용 과제와 알고리즘 코딩테스트를 전혀 상관없는 동떨어진 프로세스로 보았는데 결국 '데이터'라는 하나의 키워드로 묶어서 연관지어 볼 수 있지 않을까.

아무튼 결론적으로 6개월 동안 근무하는 동안에도 데이터 모델링 실력은 기업이 요구하는만큼 개선되지 않았다. 특단의 처방이 필요했는데, 오버랩되는 경험으로 보아 나는 알고리즘 문제 해결이 처방전이 될 수 있다고 보였고 시즌 1324234312호 알고리즘 공부가 다시 시작된다.

고통 버티기

시간이 지나도 잊혀지지 않도록 문제를 풀고 싶었기에 최대한 답을 보내는 것을 자제했다. 아이디어를 떠올리고 구현하는 연습을 최대한 많이했다. 때때로는 하루에 한문제 밖에 풀지 못하는 경우도 있었다.

이번에는 달랐다. 6개월 동안 어떻게든 구현해내야되는 마감을 끝낸 뒤라 그런지 '어떻게든 끝내는 능력'이 생긴 거 같다. 이론적으로 정확히 이해를 못해도 일단 여러 실험을 해보면서 구현을 한다. 그리고 구현을 관찰해보면서 왜 동작하는지 확인했다. 이론적인 검증과 입증을 먼저 시도했던 과거와 다르게 먼저 시도해보고 관찰하는 실증주의를 실천했다.

그 과정은 굉장히 고통스러웠다. 이론과 정의의 완전한 습득에 평소 공을 들여왔던 나에게는 수학적 응용력이 부족했다. 떠오르지 않는 풀이를 몇시간식 떠올렸다.

갑자기 분위기 서비스 종료, 플레티넘으로의 러쉬

그렇게 백준을 열심히 풀고 있던 나날이 반복되던 와중에 백준이 서비스 종료를 한다고 한다. 당시 골드 1이었고 플레티넘을 찍는 1차적 목표를 위해 달리던 중에 서비스 종료를 한다고 하여 비상이 걸렸다. 하루에 푸는 문제 개수를 늘렸다. 이 때 티어를 높이기 위해서는 풀었던 문제 중 상위 100문제의 티어가 중요했고, 따라서 티어를 빠르게 높이기 위해서는 최소한 골드 상위권 문제를 풀어야만 했다. 어떻게든 골드 상위권 문제부터는 새로운 이론을 배우거나 문제 해결 전략을 극한으로 응용한 문제만 나오기 시작했다. 새로운 이론을 배우기보다는 극한으로 응용하는 문제들을 몇시간씩 고민하면서 아이디어를 구현으로 발전시켜 푸는데 성공했다. 이 때 고통만큼 성취감이 엄청나서 하루종일 문제를 풀더라도 지치지 않고 버틸 수 있었다.

결과 및 효과

300문제 해결에 도달했고 플레티넘 5에 도달했다. 올해 최초로 응시한 코딩테스트인 현대오토에버 코딩테스트에서는 불합격했다. 비록 TLE가 발생하는 답안을 제출하여 만점을 받지는 못했지만 모든 문제에 테스트 케이스를 통과하는 답안을 제출했다는 점에서 의의가 있었다. 그리고 해당 코딩테스트를 본 뒤에도 굉장히 많은 문제를 풀어서 지금 코딩테스트를 본다면 더 높은 점수를 받을 수 있을 것이라 생각한다.

레슨

불편한 일과 하기싫은 일을 분리해서 보는 관점이 중요하다. 아무리 익숙해져도 성취감이나 가치가 없어 보여서 하기 싫은 일들도 있다. 하지만 익숙하지가 아나서 모든 과정이 힘들고 불편한 일들도 있을 것이다. 알고리즘을 통한 문제 해결은 나에게 하기 싫은 과업이라기 보다는 불편한 일이었던 거 같다. 실제로 인간의 뇌는 처음에 낯선 것과 싫은 것을 분리해서 받아들이지 않는다고 한다. 낯선 것들에 대한 적응을 통해 더 나은 사람이 되고 싶다.

앞으로의 계획

알고리즘 공부에 투자하는 시간은 압도적으로 축소할 예정이다. 현재 학습한 알고리즘을 잘 응용하면 코딩테스트를 통과할 수 있기 때문이다. 따라서 문제풀이 실력이 떨어지지 않을 정도로 유지하고자 한다.

새로운 둥지 찾기
백준 온라인 저지가 폐쇄되면서 당분간 유사한 온라인 저지 웹사이트들간의 경쟁이 예상된다. 그 동안에는 내가 참가하고 있는 알고리즘 스터디에서 다루는 리트코드의 weekly contest 문제들을들 위주로 풀어볼 예정이다.

새로운 이론에 대한 학습이 필요하다
세그먼트 트리, 트라이까지는 간혹 코딩테스트에 출제되는 경향이 있어 아직 이론 공부가 필요하다고 생각한다. 기존 이론을 극한으로 활용하는 문제에만 대비했지만 이런 새로운 이론도 대비를 같이 잘 해야 코딩테스트를 안정적으로 넘길 수 있을 거 같다.

반례를 잘 생각해낼 수 있어야한다

알고리즘에 대한 아이디어나 전략의 방향성은 매우 좋다. 하지만 디테일한 부분에서 반례를 생각해내지 못해서 틀리는 문제들이 많아졌다. 이 부분은 난도가 어려운 문제를 풀기보다는 실버, 골드 티어에서 정답률이 낮은 문제들을 꾸준히 풀어주는 연습을 해야 개선이 되지 않을까 생각한다.

코딩테스트와 유사한 환경이 더 필요하다

실전 경험이 더 필요하다. 올해는 서류 탈락이 많아서 현대오토에버밖에 코딩테스트를 보지 못했다. 시간복잡도를 잘못 계산해서 문제를 잘못 풀어서 떨어졌다. 따라서 시간제약이 있는 코딩테스트 환경에 가까운 프로그래밍 컨테스트를 가능한 참여하려고 한다.

떠나는 백준 온라인 저지에게 한마디

BOJ야, 어느덧 함께한지 10년이 되었다. 그동안 불편해서 피해다니기만 하다가 드디어 친해지려고 할 쯤에 떠나서 아쉽다. 고통과 괴로움을 인내하는 법을 알게해줘서 고맙고, 앞으로는 더 수학도 더 잘해볼게.

Top comments (0)