이미 소장하고 있다면 판매해 보세요.
1장. 해시 테이블
__문제 1: 고유한 눈송이 ____문제 설명 ____문제 단순화 ____핵심 부분 풀이 ____해법 1: 쌍 비교 ____해법 2: 작업량 줄이기 __해시 테이블 ____해시 테이블 설계 ____해시 테이블 사용 이유 __문제 2: 복합어 ____문제 설명 ____복합어 식별 ____해법 __문제 3: 철자 검사 ____문제 설명 ____해시 테이블 방식의 적합성 판단 ____임시 해법 __요약 __참고 사항 2장. 트리와 재귀 __문제 1: 할로윈 하울 ____문제 설명 ____이진 트리 ____예제 문제 해결 ____이진 트리 표현 ____모든 사탕 모으기 ____완전히 다른 해법 ____최소 경로 이동 ____입력 받기 __재귀 사용 이유 __문제 2: 후손 거리 ____문제 설명 ____입력 받기 ____단일 노드의 후손의 수 ____모든 노드의 후손의 수 ____노드 정렬 ____정보 출력 ____main 함수 __요약 __참고 사항 3장. 메모이제이션과 동적 프로그래밍 __문제 1: 버거 마니아 ____문제 설명 ____계획 세우기 ____최적해의 특성 ____해법 1: 재귀 ____해법 2: 메모이제이션 ____해법 3: 동적 프로그래밍 __메모이제이션과 동적 프로그래밍 ____1단계: 최적해 구조 ____2단계: 재귀 해법 ____3단계: 메모이제이션 ____4단계: 동적 프로그래밍 __문제 2: 구두쇠 ____문제 설명 ____최적해의 특성 ____해법 1: 재귀 ____main 함수 ____해법 2: 메모이제이션 __문제 3: 하키 라이벌 ____문제 설명 ____라이벌 정보 ____최적해의 특성 ____해법 1: 재귀 ____해법 2: 메모이제이션 ____해법 3: 동적 프로그래밍 ____공간 최적화 __문제 4: 통과 방법 ____문제 설명 ____해법: 메모이제이션 __요약 __참고 사항 4장. 그래프 및 너비 우선 탐색 __문제 1: 나이트 추격 ____문제 설명 ____최적 이동 ____최상의 결과 ____변덕스런 해법 ____시간 최적화 __그래프와 BFS ____그래프란? ____그래프와 트리 ____그래프와 BFS __문제 2: 로프 오르기 ____문제 설명 ____해법 1: 동작 찾기 ____해법 2: 리모델링 __문제 3: 책 번역 ____문제 설명 ____그래프 작성 ____BFS 구현 ____총 비용 __요약 __참고 사항 5장. 가중치 그래프의 최단 경로 __문제 1: 생쥐 미로 ____문제 설명 ____BFS 이동 ____가중치 그래프의 최단 경로 ____그래프 작성 ____다익스트라 알고리즘 구현 ____두 가지 최적화 __다익스트라 알고리즘 ____다익스트라 알고리즘의 실행 시간 ____음수-가중치 에지 __문제 2: 할머니 집 찾기 ____문제 설명 ____인접 행렬 ____그래프 작성 ____이상한 경로 ____과제 1: 최단 경로 ____과제 2: 최단 경로 수 __요약 __참고 사항 6장. 이진 탐색 __문제 1: 개미 먹이기 ____문제 설명 ____새로운 형태의 트리 문제 ____입력 받기 ____타당성 시험 ____해법 찾기 __이진 탐색 ____이진 탐색 실행 시간 ____타당성 결정 ____정렬된 배열 탐색 __문제2: 강 건너기 ____문제 설명 ____탐욕 알고리즘 ____타당성 시험 ____해법 찾기 ____입력 받기 __문제 3: 삶의 질 ____문제 설명 ____전체 사각형 정렬 ____이진 탐색 ____타당성 시험 ____좀 더 빠른 타당성 시험 __문제 4: 동굴 문 ____문제 설명 ____하위 작업 풀이 ____선형 탐색 사용 ____이진 탐색 사용 __요약 __참고 사항 7장. 힙과 세그먼트 트리 __문제 1: 수퍼마켓 판촉 행사 ____문제 설명 ____해법 1: 배열의 최댓값과 최솟값 ____최대-힙 ____최소 힙 ____해법 2: 힙 __힙 ____두 가지 응용 사례 ____데이터 구조 선택 __문제 2: 트립 생성 ____문제 설명 ____재귀를 이용한 트립 출력 ____레이블 정렬 ____해법 1: 재귀 ____구간 최대 쿼리 ____세그먼트 트리 ____해법 2: 세그먼트 트리 __세그먼트 트리 __문제 3: 두 합 ____문제 설명 ____세그먼트 트리 채우기 ____세그먼트 트리 쿼리 ____세그먼트 트리 업데이트 ____main 함수 __요약 __참고 사항 8장. 유니온 파인드 __문제 1: 소셜 네트워크 ____문제 설명 ____그래프 모델링 ____해법1: BFS ____유니온 파인드 ____해법 2: 유니온 파인드 ____최적화 1: 크기별 유니온 ____최적화 2: 경로 압축 __유니온 파인드 ____관계: 세 가지 요구사항 ____유니온 파인드 선택 ____최적화 __문제 2: 친구와 적 ____문제 설명 ____확장: 적 ____main 함수 ____파인드와 유니온 ____SetFriends와 SetEnemies ____AreFriends와 AreEnemies __문제 3: 서랍 정리 ____문제 설명 ____동등한 서랍 ____main 함수 ____파인드와 유니온 __요약 __참고 사항 후기 부록 A. 알고리즘 실행 시간 __제한 시간의 한계 __빅오 표기법 ____선형 시간 ____상수 시간 ____추가 예제 ____2차 시간 ____이 책의 빅오 표기법 부록 B. 추가 자료 __고유한 눈송이: 암시적 연결 리스트 __버거 마니아: 해법 재구성 __나이트 추격: 이동 인코딩 __다익스트라 알고리즘: 힙 사용 ____생쥐 미로: 힙을 사용한 추적 ____생쥐 미로: 힙을 사용한 구현 __경로 압축을 압축하기 ____1단계: 삼항 연산자 제거 ____2단계: 할당 연산자 정리 ____3단계: 재귀 이해 부록 C 문제 출처 |
Daniel Zingaro
다니엘 진가로의 다른 상품
이정표의 다른 상품
이 책에서 다루는 내용
- 체스 게임을 하는 최적의 방법과 책을 번역하는 최적의 방법을 찾기 위한 너비 우선 검색 알고리듬 - 미로를 빠져나갈 수 있는 생쥐의 수 또는 두 위치 사이의 가장 빠른 경로의 수를 결정하는 다익스트라 알고리듬 - 소셜 네트워크의 연결 여부 또는 친구 여부를 결정하기 위한 유니온-파인드 데이터 구조 - 매장 판촉에서 제공되는 금액을 결정하기 위한 힙 데이터 구조 - 눈송이가 고유한지 여부를 확인하거나 사전에서 복합어를 식별하기 위한 해시 테이블 데이터 구조 이 책의 대상 독자 난이도 높은 문제를 해결하는 학습법을 배우려는 모든 프로그래머를 위한 책이다. 이 책을 통해 다양한 데이터 구조와 알고리듬, 문제 풀이에 도움이 되는 유형 및 구현 방법을 배울 수 있다. 이 책의 코드는 전부 C언어로 작성됐으나 C언어의 기초는 다루지는 않는다. 독자가 C/C++에 익숙하다면 바로 시작하는 데 어려움이 없을 것이다. 그 외에 자바나 파이썬 등 다른 언어로 프로그래밍한 경험이 있다면 대부분의 내용은 읽으면서 대략 이해할 수 있을 것이다. 그래도 1장을 시작하기 전에 C언어의 개요를 복습한다면 좀 더 도움이 될 것이다. 특히, 포인터와 동적 메모리 할당에 대해서는 기존의 프로그래밍 경험에 관계없이 숙지해 둘 필요가 있다. 독자에게 추천하는 C언어 책은 K. N. 킹의 『C Programming: A Modern Access, 2nd Edition』(W. W. Norton & Company, 2008)으로, C언어에 익숙한 사람에게도 참고용으로서 유용한 책이다. 지은이의 말 기획 단계에서 최신의 멋진 알고리듬을 설명하고 기존의 기법들과 비교하는 구성도 고민했었다. 설명을 위주로 하고 실제 알고리듬 문제를 접하지 않으면 금방 기억에서 잊힌다는 단점을 떠올릴 수밖에 없었다. 이 책은 알고리듬 기법을 먼저 설명하지 않고, 문제를 먼저 제시하는 방식을 사용한다. 게다가 제시되는 문제도 상당히 어려워서 기존의 방법으로는 쉽게 풀 수 없다. 즉, 독자들이 어려운 문제를 접하면서 이미 알고 있는 경험과 문제 해결에 필요한 지식을 연결시키는 방식으로 기술을 습득할 수 있다. 아마도 기존의 교과서에서 봤던 문제는 찾을 수 없을 것이다. 행렬을 곱하거나 피보나치 수열을 계산하는 최적 방법에 대한 내용도 없다. 또한, 하노이 탑 문제를 풀 일도 없을 거라고 장담한다. 다른 많은 훌륭한 교과서들이 이런 문제를 다루고 있는 것이 현실이지만, 과연 그런 종류의 문제에 흥미를 느끼는지는 의문이다. 오히려 독자들이 접해 보지 못한 새로운 문제를 활용하려고 한다. 해마다 수천 명의 사람들이 프로그래밍 경진대회에 참가한다. 대회를 준비하는 주최측은 참가자들이 기존 답안을 다시 쓰거나 구글 검색만 이용해서 풀 수 없도록 새로운 문제를 준비한다. 새로운 문제는 기존의 문제를 새로운 상황에 맞도록 변형하며, 참가자들이 새로운 해법을 찾아내도록 도전하고 흥미를 유발한다. 이런 문제를 푸는 데 필요한 프로그래밍과 컴퓨터 지식은 끝이 없다. 제대로 된 문제를 고를 수만 있다면 실컷 배울 수 있다. 가장 기초적인 정의를 떠올려보자. 자료 구조, 즉 데이터 구조란 데이터를 구조화해 연산을 빠르게 하는 방법을 말한다. 알고리듬은 문제 해결 방법을 순서대로 나열한 것이다. 가끔은 정교한 데이터 구조 없이도 빠른 알고리듬을 만들어 낼 수 있다. 그러나 올바른 데이터 구조를 사용한다면 알고리듬의 속도를 획기적으로 향상시킬 수 있다. 이 책을 열심히 공부하면 실력 있는 프로그래머가 될 수는 있지만, 그것이 필자의 목표는 아니다. 프로그래밍 경진대회의 문제 풀이를 통해 데이터 구조와 알고리듬을 재미있게 가르치고 배우는 것을 마음에 두고 썼다. 이 책에서 배울 만한 것이나, 재미난 것을 찾았다면 소감을 이메일로 보내주길 바란다. |
처음 테니스를 배울 때는 코트로 넘어온 공을 받아치기가 정말 어렵다. 게다가 백핸드 쪽으로 넘어오면 실수하기 일쑤다. 이후 몇 달 동안 꾸준히 연습을 하고 어느 정도 랠리가 될 정도의 기술이 몸에 익으면, 그 재미에 시간 가는 줄 모르고 빠져든다. 상위 기술인 슬라이스 백핸드, 킥 서브, 드롭 발리 등을 배우게 된다. 어느 정도 기술이 갖춰지면 서브와 발리, 칩 앤 차지, 베이스라인 공략처럼 중요하지만 눈에 보이지 않는 전략을 연구한다. 그리고 상대편 선수에 따라 어떤 기술과 전략이 가장 효과가 있는지를 알아내는 직관력을 계속 키운다. 누구에게나 무조건 통하는 만능 기술은 없다.
프로그래밍도 테니스와 마찬가지다. 코딩을 처음 배울 때는 주어진 문제를 컴퓨터에서 실행시키는 것도 상당히 어렵다. 그러나 초보를 벗어나면 진짜로 문제를 푸는 재미를 느끼게 된다. 문제 풀이를 잘 하려면 어떻게 해야 할까? 프로그래밍 분야도 다른 분야와 마찬가지로 모든 문제를 한 번에 해결해주는 만능 기법은 없다. 그러나 해시 테이블, 검색 트리, 반복, 메모이제이션, 동적 프로그래밍, 그래프 검색 등 유용한 고급 기법과 전략을 언제든 활용할 수 있다. 또한 충분한 훈련을 통해 많은 문제와 알고리듬에 딱 맞는 기법이 무엇인지를 알 수 있다. 즉, 반복 검색을 하거나 최소 연산 알고리듬이 필요하다면, 해시 테이블과 최소 힙으로 속도를 높일 수 있다는 것을 알 수 있다. 어떤 문제를 좀 더 작은 하위 문제로 반복 분할해서 해법을 찾으려면 재귀 기법을 사용하면 되고, 하위 문제가 중복될 때는 메모이제이션으로 속도를 높일 수 있다는 점도 알 수 있다. 테니스든 프로그래밍이든 상위 단계로 가려면 반복 연습과 좋은 선생님이라는 두 가지 요소가 필요한데, 바로 이 책이 그 기회를 제공한다. 이 책은 앞에서 말한 개념을 다루기만 하는 단순한 문제집이 아니다. 경진대회 기출 문제에 꼭 맞는 알고리듬을 찾아내고, 그것을 이용해서 문제를 해결하는 연습법도 제시한다. 부디 행복한 문제 풀이 시간이 되길 바란다. - 팀 러프가든 (Tim Roughgarden) |