목차
추천의 글 ... 3
베타 리뷰어 글 ... 4
저자 서문 ... 7
학습 로드맵 ... 10
part 1 자료구조
1장 리스트
01. 링크드 리스트 ... 25
배열 유감 ... 25
링크드 리스트를 소개합니다 ... 25
C 언어로 표현하는 링크드 리스트의 노드 ... 27
링크드 리스트의 주요 연산 ... 27
링크드 리스트의 예제 프로그램 ... 38
링크드 리스트의 뒷이야기 ... 43
02. 더블 링크드 리스트 ... 44
더블 링크드 리스트를 소개합니다 ... 44
더블 링크드 리스트의 주요 연산 ... 45
더블 링크드 리스트 예제 프로그램 ... 50
03. 환형 링크드 리스트 ... 56
리스트 세계의 우로보로스, 환형 링크드 리스트 ... 56
환형 더블 링크드 리스트의 주요 연산 ... 57
환형 더블 링크드 리스트 예제 프로그램 ... 59
이것만은 알고 갑시다 ... 66
2장 스택
01. 스택 주차장의 추억 ... 69
02. 스택의 주요 기능: 삽입과 제거 ... 70
03. 배열로 구현하는 스택 ... 71
스택과 스택의 노드 표현하기 ... 72
스택의 기본 연산 구현하기 ... 73
배열로 구현하는 스택 예제 프로그램 ... 75
04. 링크드 리스트로 구현하는 스택 ... 79
스택과 스택의 노드 표현하기 ... 79
스택의 기본 연산 구현하기 ... 81
링크드 리스트로 구현하는 스택 예제 프로그램 ... 84
05. 스택의 응용: 사칙 연산 계산기 ... 89
수식의 중위 표기법과 후위 표기법 ... 90
후위 표기식을 계산하는 알고리즘 ... 91
사칙 연산 계산기 예제 프로그램 ... 97
이것만은 알고 갑시다 ... 104
3장 큐
01. 큐 ... 107
02. 큐의 주요 기능: 삽입과 제거 ... 108
03. 끝은 새로운 시작이다: 순환 큐 ... 109
순환 큐를 소개합니다 ... 109
비어 있거나 또는 가득 차 있거나 ... 112
순환 큐 구현하기 ... 113
순환 큐 예제 프로그램 ... 117
04. 링크드 큐 ... 121
순환 큐 VS 링크드 큐 ... 121
링크드 큐 구현하기 ... 122
링크드 큐 예제 프로그램 ... 125
이것만은 알고 갑시다 ... 129
4장 트리
01. 트리 기초 다지기 ... 133
트리를 소개합니다 ... 133
트리를 열어봅시다 ... 134
트리 표현하기 ... 137
노드 표현하기 ... 138
트리 구현하기 ... 140
02. 이진 트리 ... 148
누구냐, 넌! ... 148
이진 트리의 여러 형태 ... 148
이진 트리의 순회 ... 150
이진 트리 구현하기 ... 154
03. 수식 트리 ... 162
수식 트리를 소개합니다 ... 162
수식 트리의 구축 ... 163
수식 트리의 구현 ... 166
04. 분리 집합 ... 173
분리 집합: 교집합을 갖지 않는 집합들 ... 173
분리 집합의 표현 ... 175
분리 집합의 연산 ... 176
분리 집합 예제 프로그램 ... 178
이것만은 알고 갑시다 ... 181
part 2 알고리즘
5장 정렬
01. 콩쥐의 해결책: 정렬 알고리즘 ... 187
02. 버블 정렬 ... 189
버블 정렬을 소개합니다 ... 189
버블 정렬은 얼마나 빠를까요? ... 191
거품을 내는 코드를 작성해 봅시다 ... 195
03. 삽입 정렬 ... 197
삽입 정렬은 무엇인가요? ... 197
삽입 정렬은 버블 정렬보다 빠를까요? ... 199
삽입 정렬 예제 ... 200
04. 퀵 정렬 ... 202
빠른 정렬, 퀵 정렬 ... 202
퀵 정렬이 퀵 정렬을 호출합니다 ... 205
퀵 정렬은 빠릅니다! ... 209
05. C 표준 라이브러리의 퀵 정렬 함수 ... 213
qsort() 함수를 소개합니다 ... 213
qsort() 함수를 테스트해 봅시다 ... 214
콩쥐가 되어 보세요 ... 216
이것만은 알고 갑시다 ... 217
6장 탐색
01. 데이터를 찾아서 ... 222
02. 순차 탐색 ... 223
자기 구성 순차 탐색 ... 224
03. 이진 탐색 ... 229
탐색 익스프레스 : 이진 탐색 ... 229
이진 탐색의 성능 측정 ... 230
이진 탐색의 구현 ... 231
C 표준 라이브러리의 이진 탐색 함수: bsearch() ... 234
04. 이진 탐색 트리 ... 236
이진 탐색을 위한 이진 트리 ... 236
이진 탐색 트리는 어떻게 생겼을까? ... 237
이진 탐색 트리의 기본 연산 ... 238
이진 탐색 트리 예제 프로그램 ... 245
뒤늦게 생각해보는 이진 탐색 트리의 문제점 ... 250
05. 레드 블랙 트리 ... 251
레드 블랙 트리가 균형을 유지하는 비결 ... 252
레드 블랙 트리의 기본 연산 ... 253
레드 블랙 트리 예제 프로그램 ... 269
이것만은 알고 갑시다 ... 282
7장 우선순위 큐와 힙
01. 우선순위 큐 ... 286
우선순위 큐의 삽입 연산 ... 287
우선순위 큐의 제거 연산 ... 287
우선순위 큐의 구현 ... 288
02. 힙 ... 288
힙에 새 노드 삽입하기 ... 289
힙의 최소값 삭제 ... 291
힙의 구현 ... 293
힙 예제 프로그램 ... 297
03. 힙을 이용한 우선순위 큐의 구현 ... 302
이것만은 알고 갑시다 ... 309
8장 해시 테이블
01. 해시에 대하여 ... 313
02. 해시 테이블: 공간을 팔아 시간을 사다 ... 315
03. 해시 함수 ... 317
나눗셈법 ... 317
나눗셈법 예제 프로그램 ... 319
자릿수 접기 ... 322
해시 함수의 한계: 충돌 ... 325
04. 충돌 해결하기 ... 325
체이닝 ... 325
개방 주소법 ... 336
이것만은 알고 갑시다 ... 350
9장 그래프
01. 그래프를 소개합니다 ... 354
오일러의 도구 ... 354
그래프의 정의 ... 355
02. 그래프를 어떻게 표현할 것인가? ... 357
인접 행렬 ... 358
인접 리스트 ... 360
인접 행렬 VS 인접 리스트 ... 361
인접 리스트의 구현 ... 362
인접 리스트 예제 프로그램 ... 363
03. 그래프 순회: 그래프를 따라 산책하기 ... 369
깊이 우선 탐색 ... 369
너비 우선 탐색 ... 372
그래프 순회 예제 프로그램 ... 376
04. 위상 정렬 ... 380
위상 정렬 예제 프로그램 ... 387
05. 최소 신장 트리 ... 391
프림 알고리즘 ... 393
크루스칼 알고리즘 ... 401
최소 신장 트리 예제 프로그램 ... 409
06. 최단 경로 탐색 ... 413
다익스트라 알고리즘 ... 414
다익스트라 알고리즘 예제 프로그램 ... 418
이것만은 알고 갑시다 ... 424
10장 문자열 검색
01. 고지식한 검색 ... 428
고지식하거나 미련하거나 ... 428
고지식한 검색의 구현 ... 429
02. 카프-라빈 알고리즘 ... 433
해시 값을 활용한 문자열 검색 ... 433
카프-라빈 알고리즘의 구현 ... 436
03. KMP 알고리즘 ... 440
접두부, 접미부, 그리고 경계 ... 440
경계 정보를 미리 계산하기 ... 442
KMP 알고리즘의 구현 ... 444
04. 보이어-무어 알고리즘 ... 448
나쁜 문자 이동 ... 449
착한 접미부 이동 ... 450
보이어-무어 알고리즘의 전처리 과정 ... 452
이것만은 알고 갑시다 ... 461
part 3 알고리즘 설계 기법
11장 알고리즘 성능 분석
01. 알고리즘의 성능에 대하여 ... 467
02. 알고리즘 수행 시간의 분석 ... 469
03. 점근 표기법 ... 470
O 표기법 ... 472
Ω 표기법 ... 474
Θ 표기법 ... 475
04. 재귀 알고리즘의 성능 분석 ... 476
재귀 방정식과 재기 알고리즘 ... 476
마스터 정리 ... 483
이것만은 알고 갑시다 ... 486
12장 분할 정복
01. 아우스터리츠 전투 ... 489
02. 분할 정복 알고리즘 ... 490
03. 분할 정복의 응용 ... 491
병합 정렬 ... 491
거듭 제곱 ... 498
피보나치 수 ... 501
이것만은 알고 갑시다 ... 509
13장 동적 계획법
01. 동적 계획법이란 ... 514
02. 피보나치 수 구하기 ... 515
동적 계획법으로 피보나치 수 구하기 ... 515
동적 계획법으로 설계된 피보나치 수 알고리즘의 구현 ... 517
03. 최장 공통 부분 순서 ... 519
최장 공통 부분 순서란 ... 519
LCS 알고리즘 ... 520
동적 계획법으로 설계하는 LCS 알고리즘 ... 523
이것만은 알고 갑시다 ... 531
14장 탐욕 알고리즘
01. 탐욕 알고리즘에 대하여 ... 535
02. 편의점 점원의 거스름돈 줄이기 ... 537
거스름돈 계산 프로그램 ... 538
거스름돈을 만드는 탐욕 알고리즘은 항상 최적일까? ... 540
03. 크루스칼의 최소 신장 트리 알고리즘 다시 보기 ... 542
04. 다익스트라의 최단 경로 알고리즘 다시 보기 ... 545
05. 허프만 코딩을 이용한 데이터 압축 ... 548
고정 길이 코드와 접두어 코드 ... 548
허프만 코딩 ... 550
허프만 코딩의 구현 ... 557
이것만은 알고 갑시다 ... 565
15장 백트래킹
01. 백트래킹을 소개합니다 ... 570
02. 미로 탈출로 찾기 ... 574
트리 대신 재귀 호출로 구현하는 백트래킹 ... 574
미로 탈출 알고리즘 구현하기 ... 576
03. 8개의 퀸 ... 585
8개의 퀸이 만드는 해공간과 백트래킹 ... 587
8개의퀸 알고리즘 구현하기 ... 590
이것만은 알고 갑시다 ... 598
찾아보기 ... 599
닫기