인사이트에서 진행하는 신간 리뷰어로 선정되어서 책을 읽게 되었다.
C++ 이지만 이해할 수 있다.
대부분의 알고리즘 책들이 그렇듯이 이 책도 C++ 코드로 설명이 되어있다. 프로그래밍 경진대회에서 가장 높은 비율로 많이 사용되는 언어인데 효율적이며 표준 라이브러리에 많은 양의 자료 구조와 알고리즘이 포함되어 있기 때문이라고 한다. 나같은 경우는 java 만 주로 하고 C++ 은 대학때 이후로 안했지만 책을 이해하는데에는 어려움이 없었다. 우선 소스코드가 길지 않고 문법상 큰 차이가 없다. 그리고 코드에 대한 설명이 글과 그림을 통해서 자세히 설명이 되어있다. 오히려 다른 언어(나같은 경우는 java)를 사용해서 C++ 로 구현된 코드를 변경해 보면서 공부를 하면 더 도움이 된다.
프로그래밍 기법에 대한 설명
알고리즘 문제를 풀기 위해서는 문제에 대한 이해도 필요하지만 이해한 내용을 코드로 옮기는 능력도 필요하다. 연필로 종이에 써가면서 문제 푸는 방법은 알았는데 이걸 코드로 옮기지 못하면 못푼거나 마찬가지 이다. 이때에 필요한 것들이 프로그래밍 기법이다. 자주 나오는 몇가지 들이 있는데 알고 있으면 정말 많은 도움이 된다. 그중에 하나로 나도 전에 알고리즘 시험볼때 자주 썼던 건데 바로 나머지 연산이다.
전에 나머지 연산을 위와 같은 방법으로 사용할 때에는 그냥 모르고 사용을 했다. 그냥 공식을 외운거였다. 그런데 고맙게도 이 책에서 설명을 해준 덕분에 이해를 할 수 있었다. 이런 기법들은 있는지도 모를 뿐더러 찾기도 어렵다. 하지만 모르는 순간 다푼 문제가 시간초과를 겪거나 자릿수가 너무 많아져서 에러가 나는 경험을 하게 된다. 그래서 이책에서 알려주는 몇가지 기법들은 문제를 푸는데 꿀팁처럼 도움이 된다.
문제에 대한 자세한 설명
나는 문제풀때 가장 어려웠던 분야가 동적계획법(DP:Dynamic Programming)이었다. 점화식을 구하면 50줄도 안되는 코드만 써도 문제가 풀리지만 그걸 도출해내지 못하면 그냥 포기해야 했다. 그런데 고맙게도 이 책에서 이렇게 자세히 설명을 해주면서 알려주고 있다. 어떤 책들은 그냥 말로만 설명해주고 끝나는 경우가 있는데 이 책에서는 그림과 공식을 설명해 주고 어떻게 도출되는지 과정도 설명을 해주고 있다.
그리고 다른 챕터들도 마찬가지 이지만 처음에는 트리, 동적계획법, 정수, 행렬등 기본적인 개념을 설명을 해주기 때문에 문제의 유형에 대해서도 파악을 할 수 있다.
수학에 대한 작은 부록
책 마지막 부분에는 이렇게 수학공식과 기본적인 내용이 담겨져 있다. 페이지 수는 그렇게 많지는 않다. 하지만 내가 생각하기에는 그 내용이 고등학교 정석책 기준으로 상당한 분량을 차지할거라 생각이 된다. 가끔 문제를 풀다 보면 분명 중,고등학교 때에 배운건데 기억이 나지않을때가 있다. 그 공식만 알면 풀릴것 같은 문제인데 도저히 생각이 안날때가 있다. 이 부록을 통해서 조금이나마 그런 내용들을 기억 속에서 되살리는데 도움이 될거라 생각된다.
결론
내가 이 책을 읽으면서 들었던 느낌은 "어! 이 책 제법 재미있네!" 였다. 읽으면서도 왠지 노트를 꺼내서 연필로 코드를 짜봐야 할것 같고 맞는지 틀린지 실행을 해봐야 할것 같은 느낌이 들었다. 위에서도 말했듯이 실제로 C++ 로 설명된 코드를 Java 로 옮겨보면서 책을 읽어가고 있다. 길지않는 챕터에 핵심과 요점들이 가득 담겨 있어서 나는 정말 만족하면서 읽고 있다. 물론 이건 사람마다 차이가 있을 수는 있다. 하지만 분명한건 어느 정도 코드를 작성할 수 있고 이해할 수 있는 사람이 알고리즘 책을 추천해 달라고 한다면 이 책을 추천해주고 싶다.