그림으로 개념을 이해하는 그로킹 알고리즘

“한빛미디어 서평단 <나는리뷰어다> 활동을 위해서 책을 협찬 받아 작성된 서평입니다.”

작년에 이미 알고리즘 책 한 권 봤는데, 왜 또 이걸 읽고 있는 거지? 사실 이유는 두 가지다. 첫 번째는 아무리 봐도 안 쓰니까 자꾸 잊어버려서 계속 봐야 한다는 것이고, 두 번째는 “그림으로 개념을 이해”한다는 표현에 꽂혀서다. 그래서 이 책을 보자마자 아이들에게 이런 책이 있다고 뀌띔했다. 그림으로 쉽게 이해할 수 있다면, 아이들에게 한 번 읽어보라 싶었다. 수업 중에 정보가 있고, 그러면 어쩔 수 없이 알고리즘은 배울 테니, 도움이 되지 않을까, 하는 막연한 생각이 들어서다.

그런데 첫 번째 이유는 나름 타당해서 문제가 없었는데, 두 번째는 문제가 생겼다. 중학교 정보 서적에서 알고리즘을 봤는데, 굳이 이런 전문도서의, 그래도 입문서격인 책이, 사실 필요없는 수준이라는 점이다. 섣부른 판단일지도 모르겠지만, 적어도 교과서 내용에서는 이 정도 수준까지 요구하지는 않을 거라는 생각이 들었다. 정보가 재밌고, 코딩이 재밌고, 그래서 주어진 문제를 해결하는 게 재밌어서 알고리즘을 제대로 공부해보자 하지 않는다면, 이 정도 난이도의 책도 아이들에겐 마냥 어려운 책일 수밖에 없겠구나 싶었다. 그래서 두 번째는 포기했다.

여기서 문제, 작년에 본 책을 다시 꺼내 슬슬 넘겨보며 읽어봤다. 그 책도 충분히 잘 만든 책이라 생각했는데, 이 책과는 결이 다른 게 눈에 보였다. 지난 책도 충분히 “기술”적으로 접근해서 잘 설명해주고 있다 생각했는데, 아무래도 그건 전산인의 눈으로 봐서 그랬을 수도 있겠다는 생각이 들었다. 저자는 프로그래밍을 취미로 시작했다가 알고리즘을 책으로 접했다가 방대한 양에 포기했다가 훌륭한 교수를 만나 그 기본 개념을 알아가기 시작했다고 말한다. 그러면서 본인이 “시각적으로 학습하는 것을 선호하고, 그림으로 설명하는 것에 익숙”하다고 말한다. 이게 이 책의 정체성을 설명하는 중요한 표현이라 생각한다.

처음 책을 펼칠 때 나의 기대는 만화책같은 느낌이지 않을까 하는 생각이었다. 곧 그건 잘못된 생각이라는 걸 알게 됐지만, 적절한 그림 표현과 문장들은 해당 내용을 전달하는 데 있어 매우 효과적이고, 심지어 코드와 해당 코드 상황에서의 그림 표현은 이해를 도울 뿐만 아니라, 머릿속에 콱콱 박아넣는 듯한 인상을 줬다. 괜히 “아마존 프로그래밍 언어 분야 베스트셀러”가 아니었다.

알고리즘의 소개를 통해 배경을 알려주고, 선택 정렬과 재귀, 퀵 정렬을 거쳐 해시 테이블과 너비 우선 탐색, 트리, 균형 트리로, 다익스트라 알고리즘, 탐욕 알고리즘, 그리고 동적 프로그래밍과 KNN 알고리즘으로 나아간 다음, 더 공부해야 할 것에서 최근 핫한 내용들과 연결되는 알고리즘들을 추가로 언급한다.

내용이 빈약한 것 아닌가? 하는 생각이 든다면, 그건 과욕이다. 사실 학술적으로 접근하면 한 장 한 장 그 분량이 대단해서 입문서가 아니라 전공서적이 되어버릴 테니까. 이만큼이나 다루는데도 핵심만 쏙쏙 짚어주면서도 설명이 쉽고 간결하다. 주요한 지점에서는 그림과 결합하여 이해하기 쉽게 전개한다. 그래서 막힘이 없기에 술술 잘 읽히는 느낌도 있다.

한 장 한 장 끝날 때마다 배운 내용을 요약하고, 연습문제를 낸다. 그런데 그 문제가 꽤 현실적이라 문제를 위한 문제로 느껴지지 않는 것도 대단하다면 대단하다. 중간 중간 나온 팁도 매우 유용하다.

처음 읽었을 때 꽤나 신선하게 다가온 설명 중 하나는 “메모리가 작동하는 방식”이었다. 메모리를 서랍에 비유하니 재밌었다.

허프만 코딩도 들어는 봤고, 쓰기도 했지만, 사실 동작 원리를 이해하고 쓰진 않았는데, 이 책에서 설명하는 내용을 보고 이제야 기초적인 이해를 한 것 같다. 사실 그냥 쓰기만 할 거라면 몰라도 되지만, 프로그래밍에 응용할 거라면, 알아두는 게 무척 도움이 될 만하다.

실제로 그래프, 특히 트리 개념은 알게 모르게 엄청나게 사용하고 있기에, 이해하는 게 절대적으로 필요하다. 그걸 이렇게 쉽게 설명하니 대단하다. 다익스트라 알고리즘은 매번 볼 때마다 어려웠는데, 이 책에서 너무 잘 설명해줘서 무척 도움이 됐다.

이 책에서 앞서 설명한 알고리즘으로 그 다음 알고리즘을 구성하거나 설명하는 식의 패턴이 해당 내용을 이해하는 데 큰 도움을 줬다. 보통은 그런 연결성을 유추하거나 지나가는 말 중에 하나로 취급할 텐데, 여기서는 앞에 알고리즘이 여기서 어떤 영향을 주고 왜 이렇게 되었는지를 아주 요긴하게 쓰고 알려 준다. 때로는 비교를 통해 왜 이게 되고 이게 안 되는지도 알려 준다. 이렇게 해주니 이해가 쉬울 수밖에. 과거 강의 시간에 배웠던 방식과는 달라서 너무 좋다. 그 때 이렇게 배웠다면 얼마나 좋았을까… 뭐 내가 게으른 탓이지만.

거듭 설명하지만, 입문서다. 이걸로 해당 알고리즘을 다 알았다고 하면 안 된다. 적어도 그 알고리즘을 깊이 이해하기 전, 기본 개념을 잡는 데에는 매우 유용한 책임을 주지해야 한다. 그렇다고는 해도 너무 가볍게 볼 필요도 없다. 이 책을 써서 프로그래밍을 한다고 해도 문제 될 건 없어 보인다. 이해하고 짜는 것도 이해 안 하고 대충 써서 짜는 것은 엄연히 다르다. 그 결과가 다르다. 결국 같은 결과를 얻더라도 O(log n)으로 나올지 O(n!)으로 나올지는 선택의 문제다. 올바른 선택을 위해서는 이 책을 추천한다. 후회하지 않을 거다.