알고리즘 공부 자료 모음
아래는 <Imagine + Engineer> 시리즈 목차이자 첫 글
보통 컴퓨터 공학과에서 보통 프로그래밍을 처음 배울 때 아래 그림처럼 화면에 삼각형 그리기부터 시작한다고 하던데, 나는 학원에서 처음으로 프로그래밍을 공부했던 터라 저런 지루한 알고리즘 짜기는 생략했다. 그러다가 프로그래머로서의 정체성이랄까, 기본적인 자격증을 하나 따놓기 위해서 '정보처리기사'를 공부하면서 조금 알고리즘이 무엇인지에 대해 맛을 볼 수 있었다. 다만 거기에 나오는 내용 정도는 크게 어려운 내용이 아니었던 터라 기출문제 한 두개를 외우는 것으로 넘어갈 수 있었다.
그러다 개발을 웹 개발을 처음 배우면서 만났던 난관은 '어떻게 게시물의 페이지 처리를 할까?' 하는 것이었다. 영어로는 pagination이라고 하는데, 요즘은 가장 아래의 게시물이 나오면 자동으로 다음 게시물을 불러오는 형태라 만나기 어려워졌지만 그래도 처음 게시판 기능을 만들면서 곤란했던 기억이 난다. '한 페이지에 보여줄 게시물의 개수는 몇 개인지', '그 게시물에 따라서 전체 페이지는 몇 개가 되는지', '다음 페이지에 더 게시물이 없을 경우 남은 페이지 버튼은 어떻게 처리할 것인지'는 너무나 당연스럽게 써오던 기능이었지만 만드려고 하니 전혀 당연한 것이 아니었다.
그리고 첫 회사에서 게시글 추천 알고리즘을 짜면서 처음으로 업무 상에서 알고리즘을 만났다. 상거래 기반의 서비스였던 터라 고객이 남긴 별점과 조회수, 댓글 수와 거래량, 등록일 등을 종합적으로 판단해서 사용자들이 좋은 품질의 서비스/제품을 구매할 수 있도록 하는 것이 핵심이었다. 선임 개발자 한 명과 기준을 계속 변화시키면서 자료가 어떤 식으로 배치되는지 지속적으로 테스트를 해보았다. 어떤 서비스/제품이 상위에 노출될지는 전적으로 개발자가 짠 알고리즘에 달려있었다.
그 이후로 한동안 알고리즘을 크게 업무적으로 다룰 일은 없었다. 물론 코딩이라는 것이 끊임없이 조건을 만드는 작업이기 때문에 알고리즘이 업무에 없었다기보다는, 업무에 익숙해지면서 어지간한 작업은 기계적으로 할 수 있었다는 표현이 맞겠다. 그러다 알고리즘을 공부해야겠다고 마음먹었던 것은 개발자로서 성장에 대한 욕구를 느낄 때였다. 나의 경우 수학적인 개념들을 코드로 풀어낼 수 있는 오일러 프로젝트로 알고리즘 공부를 했고, 프로그래밍 언어는 손쉽게 코드를 작성할 수 있는 파이썬을 선택했다. 알고리즘을 공부하면서 사고력뿐만 아니라 프로그래밍 언어에 대해서도 더 깊게 이해할 수 있었다.
사실 하나의 알고리즘이 만들어내는 경제적 가치 엄청나다. 실제 예로 구글은 검색 알고리즘 하나로 전 세계의 검색 시장을 평정한 기업이다. 그리고 <실리콘밸리>라는 드라마 속에서 주인공은 '피리 부는 사나이(Pied piper)'라는 음악 검색 서비스를 만들기 위해 개발한 파일 무손실 압축 알고리즘으로 거액의 투자를 받으면서 창업에 뛰어들게 된다. 검색, 파일 압축, 그리고 인공지능 등 알고리즘은 우리의 삶 곳곳에 녹아있고, 거대한 경제적 효과를 낳고 있다.
하지만 일반적으로는 취업을 위해 인터뷰에서 사용하기 위한 용도로 많이 공부하게 될 것 같다. 한국은 대기업에서는 개발자 채용 과정에서 알고리즘을 물어보는 경우가 있지만, 그 외에는 얼마나 알고리즘에 관심을 가지는지는 잘 모르겠다. 하지만 외국 IT회사에 취업 과정에는 알고리즘과 코딩 테스트가 거의 필수적이라서 외국 IT회사에 취업을 준비할 때는 알고리즘 관련된 책을 사서 공부하는 경우를 많이 보게 된다. 매번 코딩 공부할 때 책을 찾아보기 힘들었는지, 깃허브에 주요 인터뷰 관련 질문들을 모아서 정리하기도 한다. 아래의 처음 두 링크는 깃허브 상에서 사람들이 관심을 많이 갖고 있는 인터뷰 관련 질문을 모아두었다.
위의 질문이 영문이라 부담스러운 사람은 아래에 잘 정리되어 있는 사이트를 열어보는 것도 도움이 되겠다.
자료구조와 관련된 알고리즘이 궁금하다면 아래의 내용을 참고하는 것도 도움이 되겠다.
지금까지 존재하는 기술을 가지고 개발을 한다면 사실 개발자라도 크게 알고리즘을 공부하는 것이 필요 없을 가능성이 많다. 물론 문제 해결 능력이라는 이름의 알고리즘 구현 능력은 필요하겠지만. 하지만 지금까지 세상이 없었던 무언가를 만들어 내기 위해서는 꼭 필요한 영역이 알고리즘이라고 생각한다. 다만 알고리즘 구현 능력은 짧은 시간에 생기는 것은 아니라서 시간을 두고 꾸준히 연습이 필요하다.