solved.ac 플레티넘 티어 달성을 위해 공부했던 내용들을 정리하며 지내고 있다.

아직 공부를 해나가는 과정일 뿐이지만 나중에 더 뛰어난 실력을 갖게 됐을 때 이 글을 보며 어떤 생각을 할 지 궁금했다.

그래서 처음 알고리즘 공부를 시작했을 때부터 지금까지 들어왔던 생각들을 기록해두고 싶었다.

 

 

알고리즘 공부를 하게된 계기

학교 전공과목으로 알고리즘 강의를 수강했었다. 당시 강의 내용은 주요 자료구조들 직접구현, 각종 정렬알고리즘, bfs/dfs 위주의 그래프탐색 정도였다. 기본적인 알고리즘들이라고 할 수 있고 지금은 많이 사용해봤지만 당시에는 알고리즘이라는 개념을 처음 접해봤고 알고리즘이라는 과목의 특성상 강의보다는 직접 사용하며 깨닫는점이 중요하다는 것을 몰랐다.

 

졸업 후 부족한 내용들을 다시 공부하던 때에 공부해야할 기본 알고리즘으로 어떤 종류가 있을지 조사하게 됐고 아래 링크에 정리해둔 후 해당 알고리즘들부터 공부해나가기 시작했다. 이때 코딩테스트라는 개념과 백준, 프로그래머스같은 알고리즘 학습사이트들도 알게 됐고 알고리즘 공부에 흥미를 갖게 되었다.

https://smallpants.tistory.com/83

 

단순한 흥미 외에도 당시 예상컨데 개발 트렌드가 AI를 잘 활용하는 것이 중요한 쪽으로 넘어갈수도 있겠다라고 생각했다. AI에게 코드작성을 시키고 검수하는 능력이 필요하다고 생각했다. 또한 신입개발자는 새로운 프로젝트를 만드는것뿐 아니라 기존에 작성된 코드들을 읽고 이해하고 분석하는 능력이 필요하다고 생각했다. 그래서 코드를 이해하고 어떻게 작동하는지 아는것이 도움이 되리라 생각했기에 알고리즘 공부의 가치가 크다고 생각했다.

 

알고리즘 공부중 생기는 딜레마

분명 큰 도움이 되는 공부이지만 몇몇 이유로 딜레마에 빠지는 느낌도 있었다.

 

1) 짧은 코드에 대한 집착

백준이나 프로그래머스같은 사이트에서 정답 제출 후 다른 사람들이 작성한 코드와 비교를 해보게 된다. 처음엔 이 덕분에 몰랐던 라이브러리나 함수를 알게되어 직접 수십줄에 걸쳐 구현했던 기능들을 한줄로 줄일 수 있게 되곤 했다. 다만 라이브러리들을 어느정도 익히고 난 후에도 더 짧고 간결하게 작성된 다른 사람들의 코드를 보며 문제풀이 도중에도 풀이 자체에 집중하는것보다 코드의 양을 어떻게 하면 줄일지 생각하게 됐다.

 

반드시 짧은 코드가 좋은것이 아니라 다른 사람이 봤을때도 이해가 되는 코드가 더 좋다고 볼 수도 있기에 코드를 줄이는 것보다 제대로된 기능을 구현하는데 집중해야 할 듯 하다.

그럼에도 정말 짧은 코드로 제출한 사람들의 코드를 보면 멋있어보이긴 한다...

 

2) 알고리즘 반영에 대한 집착

간단하게 구현 가능한 코드도 시간복잡도, 공간복잡도에 과도하게 집착해서 코드 작성 시간은 오래걸리고 코드는 복잡하게 구현하게 된다. 

 

성능보다는 개발속도가 더 중요한 때도 있을것이니 꼭 내가 아는걸 다 써먹으려고 하지 않아야 할지도 모르겠다.

 

3) 우물 안 개구리

사용할 줄 아는 알고리즘 내에서 고민하다보니 같은 생각만 뱅뱅 도는 경우가 생기곤 했다. 그러다 도저히 못풀겠을 때 정답코드를 보면 내가 전혀 모르던 새로운 알고리즘을 사용해야 하는 문제인 경우도 많았다.

 

시간복잡도 공간복잡도 개념을 배운 후로는 적어도 내가 아는걸로 못푼다는걸 눈치채기까지 걸리는 시간은 짧아졌다.

 

4) 언제까지 고민해야 하나

한 문제를 30분 이상 고민해도 풀지 못하고 있다면 정답코드를 보는것이 맞는지, 아니면 몇시간이 걸리더라도 계속 생각해보는것이 맞는지 고민이 된다.

 

몇시간동안 고민을 해서 결국 풀지 못하면 시간낭비일수도 있지만 그 과정에서 생각해본 많은 시행착오가 내 경험이 될것이다. 반면 정답코드를 바로 본다면 해당 방법을 빠르게 이해한 후 유사한 문제들을 풀어보면서 익히면 된다.

 

결국 나는 정답코드를 본 후 유사문제들을 푸는쪽이 좋다라고 결론내렸다. 누군가 나에게 곱셈을 할 줄 아냐고 묻는다면 당연히 그렇다고 답할것이다. 하지만 내가 곱셈을 어떻게 할줄 아는지 생각해본다면 난 곱셉의 원리를 수십시간 고민해서 스스로 깨닫은것이 아니다. 어린시절 노래부르듯 외웠던 구구단이 내 곱셈의 근간이 되었을 뿐이다. 그럼에도 난 현재 곱셈을 아주 잘 사용하고 있기에 알고리즘도 정답코드를 확인한 후 유사 문제들을 많이 풀면 훗날 난 그 알고리즘을 잘 사용하는 사람이 되어 있을것이다.

 

5) 프로젝트를 하는게 더 좋지 않을까

알고리즘 공부는 물론 큰 도움이 되겠지만 개발의 최고 묘미는 내가 만들고 싶은 프로그램을 만들면서 재미를 느끼는데에 있다고 생각한다. 알고리즘 공부를 하다가 막히거나 너무 공부한다는 느낌이 들때가 있다. 이럴땐 만들고 싶은 프로그램이나 이미 만들어둔 프로그램에 수정해야할 내용들이 생각나기 마련이다. 게다가 프로그램 만드는 과정에서도 배우는것은 많을것이니 알고리즘 공부가 하기 싫을땐 비교되기 마련이다.

 

그럼에도 오랜기간 하다보면 몇 주, 몇 달전에는 전혀 못풀던 문제들을 지금은 아주 쉽게 푸는 경험을 하게 되고 알고리즘 공부도 재밌어지기 마련인듯 하다.

 

6) 개발과정과 알고리즘풀이간의 차이

개발과정은 정해진 목표를 향해 모르는걸 써보기도 하고 즉석에서 배워가면서 사용하기도 한다. 반면 알고리즘은 아는 범위내에 최대효율을 고민하게 된다. 

 

개발과정은 처음엔 계획했던대로 잘 짜여진 짧고 정갈한 코드가 만들어지지만 오류를 수정하고 기능을 추가하다보면 코드가 지저분해질 여지가 많다. 반면 알고리즘문제를 풀다보면 코드양을 줄이려는 무의미한 집착을 갖게되곤 한다. 코드양을 줄이려는 집착을 버리는것이 최고겠지만 그렇지 못하다면 개발과정에서 코드가 늘어나는것을 불편하게 느끼게 된다.

 

 

그럼에도 알고리즘 공부를 이어나가는 이유

첫번째 이유는 당연하게도 알고리즘 공부는 더 나은 프로그램 작성에 도움이 된다.

두번째 이유는 처음 알고리즘 공부를 시작하던 당시에는 어렵게 느껴졌던 문제들이 지금은 쉽게 풀리게 되면서 스스로 발전하고 있음을 느끼기에 재미가 붙는다.

세번째 이유는 문제를 못풀어서 오래 고민할 때 고민으로 얻은 인사이트보다 그렇게 실패를 했음에도 다음날 또 계속 이어나가는 끈기와 꾸준함이 어쩌면 더 큰 가치가 아닐까 생각된다.
네번째 이유는 그래도 플레티넘은 찍어야지 라는 생각 때문에