PS 공부 기록

Diamond V / 알고리즘을 공부하는 이유

정글러 2022. 1. 8. 04:55

와! 목표달성!

 

 

코테를 뚫는데에는 골드 상위 문제를 푸는것으로도 충분하다는 말이 있다. 코테를 뚫어본적은 없지만 아마도 맞는 말이라고 생각한다. 그럼에도 굳이 위로 올라가면서 새 알고리즘을 배운 것은, 코딩테스트가 아니라 실제 개발에서 쓰일 알고리즘들이 보였기 때문이다.

 

문자열 알고리즘은 텍스트가 쓰이는 온갖 곳에 다 활용될 것이고, 이분매칭, 최대유량은 네트워크 플로우라는 이름처럼 네트워크 연결의 우선도를 부여하는 데에 쓰일 수 있을 것이다. 각종 트리의 자료구조는 말할 것도 없고. 수학쪽은 솔직히 재밌어서 푼건데 암호와 보안에 활용될 수도 있다 본다.

 

개발자는 끊임없이 새 기술을 공부해야 한다는 말이 있다. 나는 이 말이 단순히 새로 나온 기술 스택 정도에만 해당되는 것이 아니라고 생각한다. 알고리즘도 '로직의 개선으로 성능을 향상시키는' 기술의 일종이다. 게다가 투자해야 할 시간과 노력도 새 언어나 프레임워크를 익히는 것보다는 적다(아마도?). 일종의 가성비가 좋은 실력향상수단인 셈이다.

 

플래티넘 단계에서 새로 배우는 알고리즘들은 대부분 시간과 자원의 절약을 다루고 있었다. 문제에 시간과 메모리 제한이 없다면 새로 뭘 배우지 않아도 누구나 구현할 수 있는 문제들이지만, 빡빡한 제한을 둠으로써 새 알고리즘을 공부하도록 구성되어 있다. 무한한 시간과 메모리가 있다면 브루트포스로도 뭐든지 할 수 있지만 자원을 허용치까지 절약하기 위해 DFS, BFS를 배우는 것처럼, 모든 분야의 모든 문제에 대해서 자원을 절약하기 위해 알고리즘들이 고안되었고 그것을 배우는 것이다. 그리고 그중 그래프 탐색, 쿼리 처리, 문자열/수열 등 실제 개발에서도 자주 쓰일 알고리즘들을 아는 것은 '개발 실력'에 직결된다고 생각한다.

 

사실 한두달 공부하는 것으로 저 알고리즘들을 다 자유자재로 쓸 수는 없다. 실제로도 거의 응용을 거의 하지 않는 기초예제들만 풀면서 올라왔다고 생각한다. 하지만 개념이라도 아는 것과 아예 모르는 것은 큰 차이가 있다. 문제가 생겼을 때 그것을 해결할 알고리즘을 개념이라도 알고 있으면 더 깊게 공부하는 것으로 응용의 수준에 도달할 수 있지만, 더 나은 알고리즘의 존재조차 모른다면 애초에 자기가 모른다는 사실도 모르니 할 수 있는 것이 없다.

 

그런 강박감을 갖고있었기에 애초의 계획보다 빠르게 많은 것들을 배울 수 있었다고 생각한다. 원래는 정글 끝날 때까지 천천히 배워보자는 생각이었지만, 알고리즘 하나를 알고 모르는 것에 따라 나만의무기에서 만들 서비스의 성능이 바뀔 거라고 생각하니 늦게 배웠다간 언젠가 후회할 수도 있다는 생각이 들었다. 무엇을 개발하든 '속도'는 서비스에서 가장 중요한 이슈 중 하나인데, 그것을 개선할 수 있는 방법을 많이 쥐고 있어서 나쁠 것이 없지 않을까.

 

 

 

쉽게 말해 그냥 배우는 김에 많이, 넓게 배웠다는 말인데, 이제는 당장 눈앞의 일에 집중해야 할 시기가 된것같다. 과연 핀토스와 나만의무기를 진행하며 그럴 짬이 있을지는 모르겠지만, 위로 올라가는것만을 보느라 놓친 부분들을 챙겨야 할 때가 왔다.

카카오는 오픈테스트지만 라이브러리나 인터넷 검색을 허용하지 않는 코테를 보는 곳도 많다. 자주 쓰는 문법구문이나 상용라이브러리 import같은 것들을 한번 만들어둔 라이브러리에서 복붙하다보니 스펠링도 못외운 것들이 많은데, 그런 기초부터 쌓아야겠다. 요 몇주 응용을 거의 안하는 문제만 풀다보니 바닥을 치게된 구현력도 기르면 좋고. 화이트보드 코테를 보는 곳도 있으니 남에게 설명하는 연습도 해야 한다.

 

코테를 보는 모든 기업의 문짝을 뜯고 들어가겠다는 마음가짐으로 빡세게 준비해야겠다.