규도자 개발 블로그

개발자가 알고리즘을 알아야 되는 이유에 대해서 생각해봤다. 본문

Topic

개발자가 알고리즘을 알아야 되는 이유에 대해서 생각해봤다.

규도자 (gyudoza) 2020. 5. 10. 18:20

개발자가 알고리즘을 알아야 되는 이유에 대해서 생각해봤다.

일단 나는 정규적인 프로그래밍 학습과정을 거친 것이 아니라 단순 "만들어 보고 싶은 게 있다"는 생각으로 국비학원에서 프로그래밍을 배워 프로그래머로 정착하게 됐다. 국비학원의 특성상 짧은 시간 안에 업에 뛰어들 수 있는 인재를 만들어야 하므로 학과적인 가르침보다는 실무적인 가르침이 컸다. 그마저도 부족한 게 실상이지만.
 학원에서 배웠던 알고리즘 비슷한 건 별찍기나 주사위 기록하기, 로또번호 생성기 등 기본 중 기본이었다. 오히려 부족한 학력을 채우기 위해 혼자 따로 공부했던 정보처리기사를 준비하며 배웠던 알고리즘이 훨씬 많았다. 하지만 그때까지만 해도 알고리즘을 왜 배워야 하는지에 대한 정확한 이유에 대해선 몰랐다. 그냥 내가 따려는 자격증에 필요했으니까 공부했지.

 그렇게 취직을 했고 퇴사를 했다. 해외에서 공부를 하다가 코로나 때문에 반 강제로 귀국하게 되어 이대론 안되겠다 싶어 재취업을 하려는 중인데 알고리즘에 발목을 많이 잡히고 있다. 이 블로그를 보면 알겠지만 난 알고리즘문제를 꾸준히 풀어왔다. 그럼에도 불구하고 꼭 테스트만 보면 낙방을 하게 된다. 그래서 많은 생각들을 하게 됐고 그걸 지금부터 써보려 한다.

 

1. 알고리즘 문제는 수학문제와도 같다.

이건 내가 새로운 형식의 알고리즘 문제들을 접하게 됐을 때 들었던 생각이다. 예를 들어 스택, 큐, 문자열 자르고 붙이기 등은 통빡을 굴리면 어떻게든 해결이 된다. 하지만 그래프 문제나 이진 트리, 이진 탐색 트리 문제 등은 해당 개념들에 대해서 알고 있지 못하면 접근조차 불가했다. 나는 이런 문제들을 맞닥뜨리기 전까지 알고리즘 문제는 단순 "창의력 문제"로만 생각하고 있었다. 왜냐. 난 알고리즘을 제대로 배운 적도 없음에도 불구하고 많은 문제들을 풀어왔기 때문이었다. 하지만 그건 큰 오산이었다는 걸 깨달았다.
 알고리즘도 일종의 수학공식과도 같으며 수학문제와 비슷하게 문제해석 → 공식 대입 → 정답 추출의 과정을 거쳐야 한다. 수학문제와 마찬가지로 공식을 모르면 풀 수 없는 문제들이 존재한다. 하지만 난 위에도 말했듯이 알고리즘 문제를 창의력 문제로 착각하고 있었고 배워야할 공식이 있다는 걸 알게 됐을 때 나는 왜 이걸 혼자서 떠올리지 못했나 굉장히 좌절했었다. 지금 생각해보면 새로운 공식을 만든다는 건 천재들이나 할 수 있는 일인데 난 천재도 아니면서 왜 그런걸로 좌절했었나. 신기하고 재밌다.
 아무튼 알고리즘은 창의력문제가 아니다. 창의력있게 풀 수도 있지만 정도가 있는, 일종의 수학문제와 궤를 더 가까이 한다.


2. 그러니까 알고리즘은 결국 배워야 한다.

배워야 한다. 알고리즘을 많이 푸는 것도 일종의 학습방법이 되겠지만 체계를 갖추고 단계적으로 배우면서 개념을 학습해나가야 한다는 얘기다. 예를 들어 좌표가 그려진 수학문제를 마주했을 때 이것이 미적분으로 풀어야 할 문제인지, 삼각함수를 대입해야할 문제인지, 아니면 단순 함수문제인지 어떻게 알까? 저 개념들을 인지하고 있어야 가늠이라도 될 것이고 많이 풀어봤어야 실제로 풀 수 있을 것이다. 그런 것처럼 알고리즘 문제를 만났을 때 이게 그래프 문제인지, 트리 문제인지 개념을 배워놔야 알 수 있고 또 많이 풀어봤어야 풀 수 있을 것이다. 당신이 폰노이만 같은 역사에 남을만한 석학이 아니라면 말이다.


3. 그래서 알고리즘이 코딩실력 향상에 도움이나 되냐?

된다. 무지무지 된다. 나도 능률이나 생산성이라고 하면 남부럽지 않다. 기간이 3주였던 코딩과제를 하루만에 쳐낸 적도 있는 데다가 기획자가 실수로 빼먹은 기능을 하루만에 기획, 구현, 적용까지 끝낸 적도 있으니까 말이다. 하지만 이게 코딩을 잘하는 것일까? 단언컨대 아니라고 할 수 있다. 이건 그냥 빨리 하는 것이지 잘하는 것이 아니다. 그리고 빨리하는 것에는 "대충"이라는 개념도 섞이기 마련이다.

 이얘기를 왜하냐. 알고리즘과 관련없는 얘기 아니냐 할 수도 있겠다. 하지만 이렇게 말하면 와닿을 것이다. 알고리즘을 공부하는 것은 빠르고 견고한 코딩을 가능하게 하는 방법이다.

 한 예를 들어보자. A가 물류창고에서 일하고 있는데 한 선반에 있는 모든 박스의 갯수를 파악해야 한다. 모든 선반은 같은 규격이며 박스는 곳곳이 빠져있다. 여기서 A는 어떻게 주어진 업무를 수행할 것인가? 위에서 나는 알고리즘 문제가 일종의 수학문제와도 같다고 했듯이 알고리즘은 수학공식과도 같다고 할 수 있다. 그것을 이 예에 적용하면 다음과 같이 생각해볼 수 있다.
 만약에 A가 곱하기를 배우지 않은 미취학 아동이라면 끝에서 끝까지 박스를 하나하나 세어가면서 기록할 것이다. 이 방법은 시간이 매우 오래걸리며 박스가 많아질수록 부정확해질 확률이 높아진다.
 만약에 곱하기를 배운 사람이라면 가로와 세로에 들어가는 박스 숫자를 세고 모든 칸의 갯수를 구한 다음에 빠져있는 칸의 갯수를 뺄 것이다. 첫번째 방법보다 속도도 훨씬 빠를 뿐더러 더 정확할 것이다.
 이런식으로 어떠한 문제를 맞딱뜨렸을 때 그 문제를 해결할 방법은 자신의 지식에 근거하여 나오기 마련이다. 그러니 많은 알고리즘 방법들을 숙지하고 있을수록 어떠한 문제와 부딪혔을 때 더 좋은 방법을 떠올릴 확률이 높아진다. 그런고로 결국 알고리즘 공부는 실무에 도움이 된다.


4. 결론

결론은 뭐 없다. 알고리즘 공부를 놓으면 안 된다. 최근 캐나다 워홀에 합격해서 영어공부 한답시고 깝치면서 필리핀까지 갔다가 반강제 귀국당하고 코딩테스트에서도 번번히 낙방하는 일련의 사건들을 겪고 나니 확실히 느꼈다. 영어공부할 때가 아니라 알고리즘 공부를 할 때였다는 걸.
 알고리즘 공부. 확실히 하자.

Comments