코딩 인터뷰 퀘스천 - 문제로 풀어보는 코딩인터뷰 가이드북
이 책은 코딩 인터뷰(Coding Interview)를 준비하는 사람들을 위해 문제 모음과 이에 대한 전략적인 해결 방법을 소개하는 트레이닝 가이드북입니다. 코딩 인터뷰는 주어진 문제를 해결하는 능력을 테스트하는 수단으로서 알고리즘 경시대회는 물론 SW 기업에서도 지원자의 문제 해결 역량을 테스트하는 척도로 도입하는 추세입니다.
이 책은 프로그래밍 기초 개념부터 시작해 복잡도 표기법과 성장률 등등의 알고리즘의 기초 개념, 그리고 스택과 큐, 연결 리스트, 트리와 힙, 그래프에서부터 정렬과 선택, 분할 정복, 동적 계획법 까지 자료구조와 알고리즘 분야에서 자주 출제되거나 질문으로 물어보는 문제들을 소개하면서 이에 대한 해결 방법들도 자세하게 다루고 있습니다.
책 마지막 부분에는 면접 시 예상 질문과 최적의 해답, 그리고 네트워크, 데이터베이스 같은 주요 IT 기술 개념들을 소개하면서 코딩 인터뷰나 실무 테스트를 준비하는 독자들에게 문제 해결력과 논리력, 자신감을 단련시킬 수 있도록 폭 넓고 다양한 주제를 다루었습니다.
프로그래머가 되고 싶은 자!
코딩 인터뷰는 이제 피할 수 없는 대세다!
최근 국내 IT 대기업을 시작으로 SW 개발 분야 및 프로그래머를 채용할 때 즉석에서 주어진 문제 해결 능력을 테스트하는 프로그래밍 면접, 이른 바 코딩 인터뷰(Coding Interview)를 도입하는 사례가 늘어나기 시작했습니다. 지원자들이 숨겨진 실력을 직접 눈으로 확인하고자 하기 위함이기도 합니다. 이렇게 코딩 인터뷰는 IT 분야로 진출하기 위해 나를 시험하는 장벽이지만 나의 실력을 보여주고 되돌아보면서 실력을 키울 수 있는 기회이기도 합니다.
이 책은 코딩 인터뷰를 대비하기 위해 자료구조와 알고리즘 분야에서 중요하게 다뤄지거나 자주 출제되는 문제들을 폭넓고 다양하게 다루고 있습니다. 하지만 코딩 인터뷰에만 국한하지 않고 IT 기술 면접은 물론 프로그래밍 경시대회까지 IT 분야로 진출하고자 하는 독자들이 테스트라는 장벽과 맞딱뜨렸을 때 효과적인 해결법을 제시할 수 있도록 도움을 주기 위함이 이 책이 태어난 이유입니다. 이 책에서 다루는 모든 주제를 이해하려면 정독해보는 걸 추천하는데 언제든지 참조하고 싶은 부분이나 보고싶은 챕터로 찾아 볼 수 있습니다.
IT 취업 준비생들 뿐만 아니라 코딩 인터뷰를 도입하려는 IT 인사팀, 알고리즘 문제 해결 능력을 키우고 싶거나 좀 더 효과적인 해결 방안을 찾고자 하는 현업 프로그래머나 학생들도 이 책이 길잡이가 될 것입니다.
이 책의 구성
Chapter 01. 프로그래밍 기초
이 챕터에서는 변수와 자료형, 자료 구조를 비롯해 파라미터 전달 기법, 기억 영역 등 프로그래밍을 하면서 접하게 되는 필수적이고 기초적인 내용들을 다루고 있습니다. 예시 문제들과 함께 기초를 탄탄히 다질 수 있도록 해줍니다.
Chapter 02. INTRODUCTION
여기서부터 본격적으로 알고리즘과 자료구조에 대한 기초 내용을 정리한 개요 부분을 배우게 됩니다. 알고리즘의 개요, 시간 복잡도와 공간 복잡도, 성장률, 분석 유형, 점근 분석 등등을 다루게 되는데 알고리즘 성능을 좌우하는 복잡도에 대한 내용은 이 책 전반에서 중요하게 다루고 있습니다.
Chapter 03. 재귀와 역추적
이 챕터에서는 자신을 반복해서 호출하는 재귀와 분할 정복법을 사용하는 완전 검색 방법인 역추적(백트래킹) 관련 내용을 문제와 함께 다룹니다. 재귀와 역추적은 다른 챕터에서도 등장하는 주제이므로 주의 깊게 학습해야할 챕터입니다.
Chapter 04. 연결 리스트
여기서는 자료 구조에서 빠지지 않는 연결 리스트(링크드 리스트, Linked List)에 대한 내용을 문제와 함께 다룹니다. 연결 리스트의 동작 원리와 종류 등등 기본 개념부터 소개한 후 이와 관련된 문제들을 소개하고 있습니다.
Chapter 05. 스택
스택은 데이터를 저장하는데 사용되는 자료구조이며 앞에서 소개한 연결 리스트와 함께 단골로 나오는 개념이기도 합니다. 스택의 동작 원리와 구현 방법을 다루고 나서 관련 문제들을 소개하고 있습니다.
Chapter 06. 큐
큐는 앞에서 살펴본 스택과 연결 리스트와 함께 자료 구조 분야에서 빠지지 않는 존재입니다. 여기에서는 큐의 개요와 동작 원리 등을 살펴보고 관련 문항들을 살펴봅니다.
Chapter 07. 트리
이 챕터에서는 비선형 자료 구조의 대표적인 사례인 트리(Tree)에 대해 다룹니다. 트리의 종류부터 시작해 트리를 방문하는 운행법 등등 중요한 개념들을 소개하고 나서 이와 관련된 문항들을 살펴보게 됩니다.
Chapter 08. 우선 순위 큐와 힙
여기서는 우선 순위 큐와 힙(Heap)에 대한 내용을 다룹니다. 우선 순위 큐의 개요와 구현 방법, 이를 이어서 힙의 정의와 주요 개념들을 다루고 나서 문항들을 살펴봅니다.
Chapter 09. 그래프 알고리즘
그래프(Graph)는 우리 일상 생활에서도 자주 등장하는 분야이기도 합니다. 대표적인 예가 바로 내비게이션에서 최단 경로 혹은 통행료가 적게 드는 경로를 검색하는 기능일 것입니다. 이 챕터에서는 이러한 그래프 알고리즘을 사용하는 내용들을 문항과 함께 다룹니다.
Chapter 10. 정렬
전산에서 정렬을 매우 중요한 알고리즘 중 하나입니다. 문제의 복잡도를 줄여 효율성을 높이기도 하기 때문에 알고리즘 분야에서 많은 연구가 이루어져 왔습니다. 여기서는 이러한 정렬에 대한 내용들을 문항과 함께 다룹니다.
Chapter 11. 검색
이 챕터에서는 검색(Search)에 대한 내용을 다룹니다. 검색은 수많은 데이터가 저장되어 있는 컴퓨터에서 찾고자 하는 데이터를 효과적으로 찾기 위해 필요한 것이 바로 검색 알고리즘입니다. 검색의 종류와 방법들을 문항과 함께 소개하면서 학습할 수 있도록 하고 있습니다.
Chapter 12. 선택 알고리즘
검색에 이어 선택 알고리즘도 알고리즘에서 자주 등장하기도 합니다. 특히 선택 알고리즘은 정렬 문제와 함께 다뤄지기도 합니다. 이 챕터에서는 이러한 선택 알고리즘에 대한 개념들과 문항들을 살펴봅니다.
Chapter 13. 심볼 테이블
우리 일상 생활에서 사전(Dictionary)을 사용하는 경우가 있는데 컴퓨터 과학에서 ADT를 참조할 때 사전보다는 심볼 테이블이라는 용어를 사용합니다. 여기서는 심볼 테이블에 대한 개념과 구현 가능한 방법을 소개하고 있습니다.
Chapter 14. 해싱
해싱(Hashing)은 빠르게 정보를 저장하고 검색하기 위해 사용하는 기법 중 하나이며 최적의 검색이 필요한 부야 사용되며 심볼 테이블 같은 자료 구조를 구현하기에 적합한 기법입니다. 이 챕터에서는 해싱에 대한 내용과 문항들을 살펴봅니다.
Chapter 15. 문자열 알고리즘
여기서는 문자열 알고리즘에 대한 내용들을 다룹니다. 문자열 매칭 문제, 오토마타, KMP 알고리즘, 보이어-무어 알고리즘, 트라이와 같은 내용들을 문항과 함께 소개하고 있습니다.
Chapter 16. 알고리즘 디자인 기술
이 챕터에서는 알고리즘 분류 방법들을 간단하게 소개하고 있습니다. 구현 방법과 디자인 방법에 따라 분류하는 방법을 다루고 있습니다.
Chapter 17. 탐욕 알고리즘
탐욕 알고리즘(Greedy Algorithms)은 주어진 시점에서 최선책을 찾는 알고리즘 분야의 단골 소재이기도 합니다. 이 챕터에서는 이러한 탐욕 알고리즘에 대한 내용을 문항과 함께 다루고 있습니다.
Chapter 18. 분할 정복 알고리즘
앞에서 살펴본 탐욕 알고리즘으로 해결하지 못하는 문제들이 종종 있습니다. 이런 문제들 중 일부는 분할 정복(Divide & Conquer, D&C) 알고리즘으로 해결할 수 있습니다. 이 챕터에서는 분할 정복법에 대한 내용들을 문항과 함께 다루고 있습니다.
Chapter 19. 동적 계획법
이 챕터에서는 종속 행렬 곱셈, 부분 집합, 배낭 문제, 판매원 순회 등등 동적 계획법(Dynamic Programming)에 대한 내용을 문항과 함께 다루고 있습니다.
Chapter 20. 복잡도 클래스
여기서는 알고리즘의 복잡도 클래스에 대한 내용들을 다룹니다. 결정 문제, P, NP, Co-NP 등등의 개념들을 소개하고 있습니다.
Chapter 21. 디자인(설계) 인터뷰 질문들
이제부터는 알고리즘이나 자료구조 내용 이외의 부분을 다룹니다. 이 챕터에서는 흔히 디자인 패턴이라 불리는 분야를 다루고 있습니다. 싱글톤 패턴부터 시작해 프로토타입, 데코레이터, 추상 팩토리, 어댑터 등등 여러 디자인 패턴들을 예시와 함께 소개하고 있습니다.
Chapter 22. 운영체제 시스템 개념
이 챕터에서는 IT 분야에서 전공 과목으로 다루는 운영 체제에 대한 내용을 살펴봅니다. 운영체제의 종류들과 커널, 스레드, 위험 영역 문제, 교착 상태와 세마포어 등등 운영체제에서 다루는 주요 개념과 함께 예상 질문과 답변들을 소개하고 있습니다.
Chapter 23. 컴퓨터 네트워크 기본
여기서는 데이터 통신과 네트워크라는 주제를 다룹니다. 이 분야도 IT 전공 과목 중 하나이며 면접에서 질문으로 나오는 대표적인 분야 중 하나입니다. 인터넷부터 시작해 OSI 모델과 TCP/IP 모델, 클라이언트와 서버, 라우팅, 유니캐스트와 브로드캐스트, 그리고 멀티캐스트 등등 네트워크에서 필수적으로 다루는 이론들을 소개하고 있습니다.
Chapter 24. 데이터베이스 개념
이 챕터에서는 데이터베이스에 대한 내용을 다룹니다. mySQL, 오라클 같은 데이터베이스 관리 시스템은 개발자들이 자주 접하게 되는 분야 중 하나입니다. 여기서는 SQL문, 정규화, 조인 등등 데이터베이스와 관련된 내용들을 문항과 함께 살펴봅니다.
Chapter 25. 대답하기 어려운 문제들
이 챕터에서는 흔히 논리력을 필요로 하는 난이도가 있는 문제를 몇 가지 소개하고 있습니다. 모자 문제, 갈림길에 서 있는 쌍둥이 자매 문제, 10개의 동전 탑 등등 흥미있는 문제들도 다루고 있습니다.
Chapter 26. 기술 이외의 조언
이 챕터에서는 IT 회사에서 면접을 보게 되면 질문 받게 되는 내용을 위주로 다루고 있습니다. 면접 시 주의사항, 앞에서 살펴보았던 알고리즘과 기타 기술 외에 인성 및 성공 사례, 난관 극복 사례와 같은 질문을 받았을 때 어떻게 행동해야 하는지 가이드를 제시하고 있습니다. 참고로 회사 또는 면접관마다 다를 수도 있으니 이런 게 있다는 정도로만 알아두고 가볍게 참고할 수 있도록 다루고 있습니다.
Chapter 27. 그밖의 개념들
이 챕터에서는 지금까지 다뤄왔던 분야 외에 추가적으로 알아두면 도움이 되는 내용들을 소개하고 있습니다. C/C++, 논리 회로 분야에서 주로 다루는 비트 연산법과 기타 프로그래밍 문항들을 다루고 있습니다.
아마존의 수석 SW 디벨로퍼였으며 인도 하이데라바드 (Hyderabad)에 위치한 Mentor Graphics와 Microsoft에서 근무하다 최근에는 하이데라바드 IBM 연구소에서 활동하고 있다. 자와할랄 네루 기술 대학교(JNT University)에서 컴퓨터 공학 학사 학위를 받았고 봄베이 인도공대(IIT Bombay)에서 컴퓨터 공학 석사 학위를 받았다. 다양한 교육 센터와 대학에서 자료 구조와 알고리즘을 가르친 경험을 가지고 있다
Chapter 01 프로그래밍 기초
Chapter 03 재귀와 역추적
Chapter 05 스택
Chapter 07 트리
Chapter 09 그래프 알고리즘
Chapter 11 검색
Chapter 13 심볼 테이블
Chapter 15 문자열 알고리즘
Chapter 17 탐욕 알고리즘
Chapter 19 동적 계획법
Chapter 21 디자인(설계)인터뷰 질문들
Chapter 23 컴퓨터 네트워크 기본
Chapter 25 대답하기 어려운 문제들
Chapter 27 그밖의 개념들