nonthin***
2021-05-25

노트에 직접 알고리즘 문제 해결 과정을 쓰면서 알고리즘과 자료구조의 개념을 이해하는 학습법 안내 도서
프로그래머들은 취업하는 과정에서 코딩 인터뷰라는 것을 한다. 채용 과정에서 회사는 프로그래머의 역량을 확인해야 하는데, 게임기획자에게 기획자로서의 사고방식과 일을 해결하는 능력을 검증하는 것처럼 프로그래머는 코딩 인터뷰를 통해 그들에게 필요한 알고리즘과 자료구조에 대한 이해도를 객관적으로 검증해낼 수 있는 듯 싶다. <쓰면서 익히는 알고리즘과 자료구조>는 제목 그대로 알고리즘과 자료구조를 효율적으로 익힐 수 있는 방법을 제시하려 한다.
이 책을 읽게 된 이유는 코딩 인터뷰를 준비하기 위함은 아니고, 알고리즘적 사고력이란 것을 알고 배우기 위해서였다. 개인 개발을 하다보면 정확한 상황을 검색하면 그것에 대한 코드를 알려주는 사람은 있어도, 어떻게 해서 그런 코드를 작성해냈는지, 그렇게 작성할 수 있는지 알려주는 사람은 없다. 그저 최대한 이해한다손 치는 건데, 이번에 읽어볼 수 있는 책 중에서 <쓰면서 익히는 알고리즘과 자료구조>라는 책이 있어 알고리즘을 배우면 좀 더 코드를 작성하는데 있어 문제 해결력이 상승하지 않을까란 기대감을 가졌다.
알고리즘 문제를 해결하기 위한 능력인 알고리즘적 사고력을 높이기 위한 방법으로 <쓰면서 익히는 알고리즘과 자료구조>는 그 문제를 푸는 모든 과정을 노트에 적는 것을 제시한다. 그렇게 노트에 적는 방법을 레이아웃화시킨 것이 '알고리즘 설계 캔버스'인데 이 책은 각각의 주제에 관련한 문제들을 제시하고 그것을 '알고리즘 설계 캔버스'를 이용하고 도식화하여 푸는 과정을 하나하나 설명한다. 수학 문제에 대입하면 그 문제를 푸는 풀이법을 정리한 셈이다.
'알고리즘 설계 캔버스'는 크게 다섯 영역으로 구분된다.
- 제한사항(Constraints): 알고리즘 문제의 요구와 제한사항을 발견하고 기록하는 영역
- 아이디어(Ideas): 문제를 해결할 수 있는 1~3개 정도의 접근 방법을 고려하는 영역
- 복잡도(Complexities): 생각한 아이디어의 시간과 공간 복잡도를 추정하는 영역
- 코드(Codes): 아이디어 영역에서 논의한 내용을 바탕으로 구현할 가치가 있다고 생각한 방법을 코드로 작성하는 영역
- 테스트(Test cases): 구현된 코드의 테스트 케이스를 알아보고 코드 테스트를 진행하는 영역
저자가 바라는 것은 문제를 내고 독자가 답을 맞추길 바라는 게 아니고, 문제 해결 능력 자체를 얻는 것이기 때문에 문제의 종류 자체가 많진 않지만 챕터마다 주제를 나누고 각 문제에 대해 마치 과외를 하듯이 문자는 물론 도식화까지 이용하여 하나하나 설명해준다. 언어는 파이썬을 기반으로 하고 있지만 마치 코드 한줄 한줄 설명을 하듯이 디테일한 내용을 담고 있고, 서술 위주이기 때문에 파이썬을 (알면 좋겠지만) 모른다 하더라도 자신이 알고 있는 언어에 대입해 이해하는 것에도 크게 무리가 없는 편이다.
책에서 다루고 있는 주제는 크게 8가지로 나뉜다.
배열, 문자열, 연결 리스트, 스택과 재귀, 큐, 트리, 동적 프로그래밍, 정렬 알고리즘.
앞서 말한 것처럼 '답'이 아니라 문제를 푸는 과정을 통해 해결 능력 상승을 목표로 하기 때문에 책을 완독한 이후에도 지속적으로 무얼 배워야 할 지 방향성도 제시하고 있다.
책 내용 자체가 (주제에 따라선 깊은 내용도 있지만) 요구하는 기본적인 지식의 수준이 낮은 편이기 때문에 책에서 얘기하는 것처럼 코딩 인터뷰를 준비하는 사람이나, 알고리즘에 관심있는 개인 개발자라면 이 책을 통해 어느 정도 궁금증을 해소할 수 있을 것이라 기대한다.