[리뷰] 266가지 문제로 정복하는 코딩 인터뷰 in C++
in Review on Review, Book, Cpp, Algorithm, 코딩, 인터뷰, 알고리즘, C++, 자료구조, 면접, 도메인, 고난이도
인사이트
출판사의"266가지 문제로 정복하는 코딩 인터뷰 in C++(아드난 아지즈, 쭝시엔 리, 아미트 프라카시 저/이창현, 김현욱 역)"
를 읽고 작성한 리뷰입니다.
소프트웨어 개발 직군의 기술 면접 준비를 위한 C++ 기반 266가지 코딩 인터뷰 문제를 다룬 책이다.
본 도서는 아마존과 같은 대형 서점에서 알고리즘 분야로 베스트셀러에 해당하는 책으로 눈에 띄는 장점
을 먼저 소개하자면 다음과 같다.
우선 각 문제마다 학습에 도움이 되는 구성이 일품인데 독자의 사고 흐름
에 맞춰 집필된 점이 장점이라 할 수 있다. 이를 책에서는 EPI 스타일이라 명명하고 있는데 이 책 원서 제목의 약자이다.
먼저 이해하기 쉽게 실전 예제가 등장하며 이를 기반으로 문제를 제공하여 명시되지 않은
세부조건이나 예외 등 합격률을 높일 수 있는 다양한 생각을 도와준다.
세부조건을 명확히 하는 것은 알고리즘 설계 및 코딩의 최우선 전제조건이다. 입력 값이 배열인지, 정수인지, 양수인지, 정렬은 되어있는지 등 문제에 언급되지 않아도 스스로 조건을 설정할 수 있는 능력이 필요하다. 의외로 이런 부분을 간과하여 머리속에만 빙빙대다 실제 구현에 실패하는 경우가 잦기 때문이다.
이런 조건을 명확히 하는 능력 그리고 그 조건 명확화 과정
에서 면접관들과 커뮤니케이션하는 방법이나 자세까지 책에서 가르치고 있기에 친절한 저자의 배려가 돋보이는 책이다.
또 어려운 문제의 경우 힌트가 제공되는데 이는 가급적 스스로 골머리를 앓다가 도저히 실마리를 못 잡을 때에만 보는 것이 실전에서 문제가 변형될 경우 적응력
을 키워준다.
특히 주목할 만한 부분은 문제에 대한 해설
이다. 즉흥적으로 떠오르는 무식한 방법으로 문제를 풀어보고 이 문제가 왜 비효율적인지 살펴본다. 이를 바탕으로 더 효율적인 방법을 찾아보고 실제 데이터를 입력하여 감을 잡는다. 이후 핵심 코드를 공개하며 시간 및 공간 복잡도를 분석한다.
그 외에도 코드 길이를 줄이는 방법이나 과소 평가된 기능을 제대로 활용하는 방법 그리고 잠재적 함정으로 작용할 수 있는 부분들도 꼼꼼히 살펴본다.
이런 구성은 특정 문제를 푸는 사고 흐름 순서로 이어지기 때문에 읽고 이해하는데 매우 편리하다. 특히 실전에서 면접 문제가 변형되는 경우 거의 다 아는 문제인데도 사소한 부분때문에 면접에서 떨어지는 경우가 많은데 이런 변형에 유연하게 대응할 수 있는 사고를 키워준다는 점이 매력적이다.
그 외에 다른 책과 차별화
되는 장점도 몇가지 소개할까한다. 우선 3부의 특정 도메인 문제 파트에서 사진 공유 서비스나 추천 시스템 설계와 같은 문제도 등장한다.
실무에서 자주 개발하게 되는 애플리케이션을 설계하는 방법을 다루고 있어 조직의 비전을 이해하고 그 안에서 스스로의 역할이 무엇인지 커뮤니케이션 할 수 있는 능력을 키울 수 있음은 물론 미래에 PM급 이상의 관리자가 되었을 때의 설계 능력을 키울 수 있다. 생각보다 다양한 예제가 소개되어 놀랐다.
그 외에도 3부에서는 생성자, malloc(), 동적 링크 등 특정 언어에 종속된 기술에 관련된 문제도 다룬다. 또 싱글턴이나 푸시 옵서버 패턴 등 객체 지향 디자인 설계도 다루고 있으며 프로그래밍과 떼기 어려운 DB, Network 등의 도메인 문제도 제공되고 있어 폭넓은 기술 면접 대비가 가능하리라 생각했다.
또 서점에 알고리즘과 관련된 명작이 많지만 이 책은 그 중 비교적 최신 트렌드를 담고 있는 편이라 최근 화두인 AI를 중심으로 고민해 볼법한 문제들도 수록되어있어 신선했다.
책의 구성은 크게 4개 파트
로 나뉜다. 1부는 면접과 관련된 내용을 다루는데 준비, 실전으로 나뉘며 마지막으로 면접관 입장에서 어떤 문제를 들고가서 어떻게 평가할지의 준비 과정을 살필 수 있어 도움이 된다.
2부에서는 기본적인 면접 문재 풀이 및 차후 고난이도 문제의 기본기가 되는 기본 자료구조 및 알고리즘을 다룬다. 배열, 이진탐색, 퀵소트 등 알고리즘을 대표하는 기본 지식들이 실전문제로 등장하며 이 책의 가장 핵심이라 할 수 있겠다.
2부에서도 15 ~ 18장에 해당하는 후반부에는 다들 까다로워 하는 동적 프로그래밍, 휴리스틱, 병렬 프로그래밍 등 고급 주제를 다루는데 난이도가 어려우므로 4 ~ 14장의 기본기를 철저히 다진 후 도전하는 것이 좋겠다.
3부는 앞서 이 책의 차별화된 장점을 소개한 바와 동일하다.
4부는 어려운 문제들을 담고 있는데 허프만 코드나 정규표현식 매칭 등 알고리즘 구현 수준이 높은 문제부터 고속도로에 구간을 추가하는 등 실생활에서의 해결과 알고리즘의 연결 능력 정도를 평가하는 문제까지 매우 다양한 분야의 문제가 수록되어 있다.
개인적으로는 문제 24.19에 소개된 정렬된 이중 연결리스트를 이진 탐색 트리로 변환하는 문제에서 반가움을 느꼈다. 학부 시절 하루 동안 머리를 긁으며 고전했던 문제였는데 한 번 익히고 나니 포인터를 자유자재로 사용할 수 있게 되었다. 알고리즘 문제 풀이의 삽질 과정은 확실히 다양한 문제를 해결하기 위한 능력을 키우는데 도움이 된다.
이 책은 무려 600p가 넘는 방대한 분량을 자랑한다. 이 책 한 권을 온전히 파들어가면 왠만한 알고리즘 문제에 끄덕없을거라 장담하지만 문제는 시간이다. 저자가 서문에서 소개한 말에 따르면 1일 1문제를 풀어도 1년 정도 걸릴 분량이라고 한다.
이에 대비하여 책에는 학습할 수 있는 가용 시간에 따라 학습 플랜
을 달리 취할 수 있도록 일정에 따른 가이드를 제시한다.
각 해법인 소스 코드는 C++11 구문 및 구글 C++스타일 가이드
를 따르고 있으며 알고리즘은 밑바닥 구현에 집중하는 경우가 많기 때문에 C언어만 확실히 아는 독자라면 검색을 통해 충분히 읽을만할 것이다. 다만 C언어를 모를거나 기본적인 IDE를 활용할 줄 모르는 수준의 독자는 이해하기 어려울 것 같다.
이 책은 매우 꼼꼼하게 독자를 배려한 책으로 이 책만 제대로 독파해도 알고리즘에 관한 왠만한 문제에는 적응 할 수 있을 정도라 생각되기에 코딩 인터뷰를 준비하는 수험생에게 일독을 권하는 바이다.