[리뷰] 코딩 테스트를 위한 자료 구조와 알고리즘 with C++
in Review on Review, Book, C++, Cpp, 자료구조, 알고리즘, 리스트, 스택, 큐, 트리, 힙, 그래프, 해시, 블룸필터, 분할정복, 그리디, 탐욕, 동적계획법, Dp
길벗
출판사의"코딩 테스트를 위한 자료 구조와 알고리즘 with C++(존 캐리, 셰리안 도시, 파야스 라잔 저/황선규 역)"
를 읽고 작성한 리뷰입니다.
C++을 C++ 답게 십분 활용할 수 있는 노하우를 얻을 수 있으며, 실무에 중요하게 활용되는 알고리즘을 구현하는 방법을 배울 수 있는 책이다. 장점과 단점을 중심으로 소개해보겠다.
소개하고 싶은 장점 두가지
크게 두가지의 장점을 언급하고 싶다. 우선 STL의 자료 구조 컨테이너 혹은 템플릿 메타프로그래밍과 같은 C++에 종속적인 기법들을 각 알고리즘 별로 자세히 설명하고 있어C++의 특성
을 잘 전달하고 있다는 점을 들 수 있다.C++은 활용 방식에 따라 C언어의 무한에 가까운 자유도와 Python 같은 고수준 언어의 편리함 사이의 미묘한 줄타기 매력을 느낄 수 있다. C언어의 포인터로 고차원 언어들이 지원하지 않는 자유도를 만끽하면서도, Struct와 함수 포인터로 객체지향을 흉내내며 땀 흘린적이 있다면 이 말의 의미를 알 것이다.
반면 Python으로 어떻게 이 코드가 돌아가냐고 놀랄 때도 있는가 하면 가끔 포인터로 한방에 끝낼 수 있는 것을 빙빙 돌아갈 때 답답함을 느끼기도 한다. 그 적절한 중간 지점의 합리성을 찾는 C++의 매력은 STL이나 템플릿 등을 상황에 따라 잘 다룰 수 있어야 하는데 이 책은 C++14 표준에 맞춰 C++의 매력과 장점을 잘 전달하고 있다.
또 하나의 장점은
실습 문제와 연습 문제의 질
이다. 코딩 테스트용 알고리즘 문제는 알고리즘을 훈련하고 원하는 회사에 취업하기엔 적당하지만 제한된 시간 내 변별력을 목적으로 하고 있어 깊이 있는 문제 혹은 실전에 유용하게 활용될 만한 문제 그리고 큰 숲을 이룰만한 체계성을 가진 문제들이 적은 편이다. 단지 취업의 목적이 아니라 한 단계 넘어선 보다 큰 프로젝트를 다루고 싶다거나 자신의 주체할 수 없는 창의 욕구를 실현하기에 부족한 면이 없지 않다.만약 나와 같은 생각을 한 독자 분이라면 본 도서의 예제들이 그런 불만들을 상당 부분 해소시켜 줄 것이다. 책 소개에는 무려 67개의 문제가 등장한다고 하는데 이를 모두 다룰 순 없으므로 소개할 만한 몇가지를 압축하여 보았다.
첫번째로 소개하고 싶은 문제는 아래 그림과 같이
맵리듀스
를 구현하는 문제이다. 맵리듀스는 데이터 과학 분야에서 자주 활용되는 알고리즘으로 하둡 등의 플랫폼에서 자주 활용되는 기술이다.분할 정복 알고리즘의 몇몇 코딩 테스트 알고리즘을 풀어보면 문제의 질 때문에 한숨 나온적이 많았다. 적어도 이 예제처럼 분할 정복을 병렬 처리를 위한 목적으로 활용하는 수준의 문제를 풀어야 실무에서 빛을 발휘하지 않을까?
알고리즘을 설명하고 알고리즘을 구현하는 수준의 문제는 수학으로 따지면 사칙연산의 응용 정도 레벨에 지나지 않는다고 생각한다. 이런 부분이 이 책의 가장 큰 장점이라고 할 수 있겠는데 저자들의 다양한 경험이 축적되어 현업에서 빛을 발할 수 있는 실전적인 문제가 많다는 점을 강조하고 싶다.
개인적으로는 데이터 과학 분야에 도움이 되는 예제들이 많이 수록되어 있다는 점도 인상깊었다. 이 책의 예제 중 특히 2장 트리, 그래프 파트나 5 ~ 8장에서 다룬 그리디, 그래프, DP 알고리즘의 경우 AI 분야 강화학습 및 데이터 과학 분야에 자주 활용되는 기본 알고리즘이기에 AI를 공부하는 나로써는 많은 도움을 받을 수 있었다.
두번째 예제는
멜로디 순열
문제이다. 음악 집합 이론을 활용하는데 프로그래밍의 최고 매력은 이렇게 다른 학문과의 접점에서 가장 빛나는 것 같다. 나는 책을 고르기전 반드시 저자의 약력을 살펴보는 편인데 책의 저자 중 한 명인 존캐리의 작곡자이자 피아니스트 경력이 특히 눈에 띄였다. 아마도 이 문제는 존캐리가 낸 문제가 아닐까 싶다.프로그래밍은 현실을 대변하기도 하고 현실의 문제를 풀어주는데 그 가치가 있다. 즉, 어느 실무 분야에 접목되더라도 그 분야의 도메인 지식을 정확하고 빠르게 이해하여 사람을 돕는 프로그램을 만들줄 알아야 프로그래머로써의 가치가 빛날 것이기에 이런 신선한 문제에 많은 고마움을 느낄 수 있었다. 풀어보면 음악의 깊은 세계를 IT로 느낄 수 있다는 것에 놀라게 될 것이다.
세번째 예제도 두번째 예제와 맥락이 같다. 최대한 저렴하게
도로를 설계
하는 문제인데 그래프의 가중치나 최단 거리를 찾는 알고리즘을 적용하다보면 알고리즘을 어떻게 써야 유용한지 문제 중심의 감각을 익힐 수 있다. 이 역시 네이게이션 최단 경로 안내와 같은 업무 도메인과 결합했을 때 유용하게 활용할 수 있는 예제이다.알고리즘을 모두 잘 이해하고 구현할 수 있다고 해도 현실의 문제를 풀 수 없다면 무슨 소용이겠는가? 이 책은 이런 알고리즘과 현실의 가교 역할을 톡톡히 해낸다는 점이 매력이라 할 수 있다.
주의해야 할 점과 단점
여느 책이 그렇듯 이 책 또한 주의할 점과 단점이 있다. 먼저 주의할 점으로
난이도
를 언급하고 싶다. 이 책은 위에서 설명했듯 알고리즘의 실전 예제가 매우 수준이 높다. 취업을 목적으로 코딩테스트 통과를 목적으로 하는 수험생이라면 이 책이 적합하지 않을 수 있다. 각 예제들은 때로는 날밤새며 고요한 새벽에 깊은 집중을 필요로 하는 문제도 있다.그렇기에 알고리즘의 기본에 충실하지 않은 독자는 먼저 다른 책으로 알고리즘의 기초 정도는 충실히 학습한 후 보는 편이 나을 것이다. 아래 그림처럼 특정 알고리즘은 각 단계를 친절하게 도식화하여 설명하기도 하지만 이런 친절한 그림이 자주 등장하는 것은 아니다. 그림으로 익히는 알고리즘 유형의 책들이 시중에 많기 때문에 굳이 초보자가 난이도 높은 책으로 끙끙댈 필요는 없을 것 같다.
더불어 Python이나 Java 등 어느 특정 언어로 알고리즘의 기본 구현 정도는 해 본 사람에게 적합한 책이다. 그렇지 않으면 이 책에 숨은 C++의 장점을 십분 살리기 어려울 것이다. 알고리즘과 C++ 모두 이해하지 못한다면 이 책을 어렵게 완독한다고 해도 반쪽짜리 지식만 얻게 될 가능성이 크다.
적어도 하나의 언어에 빠삭한 사람이 알고리즘도 구현해보고 이 책으로 C++을 활용한 알고리즘과 비교한다면 C++의 매력이 무엇인지 어떨 때 쓰면 좋을지 언어 간 어떤 차이가 있는지 폭넓게 학습할 수 있을 것이다.
단점으로는 책의
친절함(?)
이 부족하다는 점을 지적하고 싶다. 일단 도식화 자료가 너무 적은 편이다. 더불어 시간 복잡도를 설명한 부분은 암기식으로 결론만 정리할 것이 아니라 멋진 예제에 시간복잡도 계산하는 방법과 절차를 다뤘다면 이 책은 어디서도 보기 힘든 역작이 되지 않았을까 하는 아쉬움도 있다.더불어 제목이 조금 마음에 안든다. 이 책은 코딩 테스트를 목적으로 하는 책이 아니다. 한 차원 더 높은 곳을 지향하는 사람들을 위한 책으로 코딩 테스트 통과를 목적으로 하는 사람에게는 되려 시간 낭비가 될 수 있다. 대신 여기 있는 문제들을 모두 풀 줄 안다면 코딩 테스트 따위는 뭐가 나와도 씹어 먹을 수준으로 변모해 있겠지만..
여담으로 온라인 서점에서 어떤 이의 평을 읽었는데 기가 찬다. 때로 본인의 목적에 맞지 않는 내용을 다룬다는 이유로, 혹은 난이도가 본인의 입맛에 맞지 않는다는 이유로 책에 혹평을 하는 이들이 있다. 이는 또 다른 목적으로 양서를 찾는 독자를 방해하는 행위라 생각한다.
왜 어려운 책은 늘 그 따위의 평점을 받아야 하고, 베스트 셀러같이 하위 90% 수준의 입맛에 맞춘 책은 칭송을 받아야 하는 건지 책을 사랑하고 리뷰를 즐기는 사람으로써 늘 불만이다. 독자의 목적에 충실한 책을 고르는데 있어 그런 서평은 무시하길 바란다.
끝으로 본 도서의 특징을 정리하며 리뷰를 마칠까 한다. 단순히 기초 알고리즘을 익히기 위한 사람이거나 C++을 배우고 싶은 사람에게 이 책은 적합하지 않다. 하지만 C++도 알고리즘도 어느 정도 알고있는 사람이 C++을 C++답게 활용하고 싶다면, 아울러 유치한 코딩 테스트 알고리즘을 뛰어넘어 현실의 문제를 알고리즘으로 해결해 보고 싶다면 이 책은 좋은 선택이 될 것이다.