장바구니 담기 close

장바구니에 상품을 담았습니다.

문제 해결력을 높이는 알고리즘과 자료 구조

문제 해결력을 높이는 알고리즘과 자료 구조

  • 오츠키켄스케
  • |
  • 길벗
  • |
  • 2022-02-22 출간
  • |
  • 412페이지
  • |
  • 183 X 235 X 16 mm
  • |
  • ISBN 9791165218874
판매가

24,000원

즉시할인가

21,600

배송비

무료배송

(제주/도서산간 배송 추가비용:3,000원)

수량
+ -
총주문금액
21,600

※ 스프링제본 상품은 반품/교환/환불이 불가능하므로 신중하게 선택하여 주시기 바랍니다.

출판사서평




알고리즘 문제를 풀 수 있다!
더 나아가, 설계하고 개선하고 확장하여 새로운 무언가를 생각해 낼 수 있다!

컴퓨터 과학을 배운다면 피할 수 없는 알고리즘
알고리즘이란 문제를 풀기 위한 절차다. 알고리즘을 배운다는 건 단순히 이론을 외우는 것이 아닌 세상의 다양한 문제를 해결하는 수단을 늘려가는 것을 말한다. 알고리즘을 잘 다뤄서 제시된 문제를 잘 풀고 싶다면? 내가 직접 알고리즘을 설계하고 더 효율이 높게 개선하고 싶다면? 이를 위해서는 어떤 알고리즘이 있는지 알기만 하는 데서 그치지 않고 설계하고 응용하는 과정을 학습해야 한다. 알고리즘 동작을 구체적으로 이해하는 걸 넘어서, 실제로 알고리즘을 활용하여 문제를 만족스럽게 해결할 때 비로소 알고리즘을 배웠다고 할 수 있다.

설계 기법을 중시하면서 알고리즘 전체를 체계적으로 설명
이 책은 문제의 답을 스스로 찾아내고, 알고리즘 지식을 확실히 자신의 것으로 만들어 활용하는 것을 목표로 한다. 이를 위해 먼저 알고리즘을 설계할 때 필요한 접근법(설계 기법)을 상세히 설명하고, 이어서 설계한 알고리즘을 효과적으로 실현하는 데 있어서 중요한 자료 구조를 살펴본다. 그리고 앞에서 배운 설계 기법과 자료 구조를 활용하여 정렬 알고리즘과 그래프 알고리즘을 배운다. 마지막으로 효율적으로 풀 수 있는 알고리즘을 설계할 수 없는 난제를 판별하는 방법과 이에 대응하는 방법을 살펴본다.

쉬운 문장, 쉬운 코드, 재미있는 그림, 어려운 내용도 간단히 이해
어려운 수식, 복잡한 내용은 담지 않았다. 중학 수학과 최소한의 C++ 지식만 있으면 알고리즘의 기초를 체계적으로 익힐 수 있다. 설계 기법에 중점을 둔 설명은 입문자뿐만 아니라 중급자 레벨에도 추천한다. 핵심 개요, 일반화, 좋은 예와 나쁜 예, 응용 예, 주의점 등을 단계별로 구성하고, 여러 측면에서 알고리즘 사고법과 기술을 살펴본다. 알고리즘, 자료 구조를 시각적으로 이해할 수 있도록 그림도 풍부하게 사용했다. 코드는 의사 코드가 아닌 C++ 코드를 사용했으며, 코드 또한 읽기 쉽고 이해하기 쉽도록 명확하게 작성하고자 했다.

이 책에서 다루는 내용
단순히 알고리즘 동작을 설명하기보다는 좋은 알고리즘을 설계하는 방법에 중점을 둡니다. 알고리즘을 처음 배우는 분부터 실용적인 알고리즘 설계 기법을 배우고 싶은 분까지 폭넓게 즐길 수 있으면 좋겠습니다.

필요한 예비지식
고등학교 수학을 배웠고 프로그래밍 경험이 있다고 전제합니다. 복잡한 수학적 이해가 필요한 부분도 있는데, 초보자에게 어려운 내용은 (*) 기호로 표시했습니다.
책에 나오는 소스 코드는 C++로 작성했는데, 기본 기능만 사용하므로 프로그래밍 경험이 있다면 큰 문제 없이 읽을 수 있습니다. C++의 고유 기능 중 다음을 사용합니다.
- std::vector 같은 STL 컨테이너
- std::sort() 같은 표준 라이브러리
- const 수식자
- 템플릿
- 포인터
- 참조
- 구조체

사용하는 언어
이 책은 C++를 사용해서 알고리즘을 작성하며, 다음과 같은 C++ 11 이후 기능을 일부 사용합니다.
- 범위 for문
- auto를 사용한 타입 추론(범위 for문에서만 사용)
- std::vector v = { 1, 2, 3 }; 같은 vector형 변수 초기화
- using을 사용한 자료형 별명 선언
- 템플릿 오른쪽 괄호에 공백 생략
- std::sort() 복잡도가 O(NlogN)이라는 것이 보증됨

동작 환경
이 책에 실린 소스 코드는 C++ 11 이후 버전의 C++에서 컴파일 가능하고, Wandbox에서 gcc 9.2.0으로 코드 동작을 확인했습니다. (번역 시 macOS Big Sur clang 12.0.0 버전에서 확인)
소스 코드는 다음 주소에서 다운로드 가능합니다.
- 저자 깃허브: https://github.com/drken1215/book_algorithm_solution
- 길벗 깃허브: https://github.com/gilbutITbook/080288


목차


1장 알고리즘이란?
1.1 알고리즘이란 무엇인가?
1.2 알고리즘 예제(1): 깊이 우선 탐색과 너비 우선 탐색
__1.2.1 빈 칸 채우기 퍼즐로 배우는 깊이 우선 탐색
__1.2.2 미로로 배우는 너비 우선 탐색
1.3 알고리즘 예제(2): 매칭
1.4 알고리즘 서술 방법
1.5 알고리즘을 배우는 의미
1.6 연습 문제

2장 복잡도와 빅오 표기법
2.1 복잡도란?
2.2 복잡도와 빅오 표기법
__2.2.1 복잡도 빅오 표기법 생각해 보기
__2.2.2 코드 2-1의 복잡도
__2.2.3 코드 2-2의 복잡도
__2.2.4 실제로 복잡도 구해 보기
__2.2.5 복잡도를 빅오 표기법으로 표시하는 이유
2.3 복잡도를 구하는 예(1): 짝수 나열
2.4 복잡도를 구하는 예(2): 최근접 점쌍 문제
2.5 복잡도 사용법
2.6 복잡도 관련 주의 사항
__2.6.1 시간 복잡도와 공간 복잡도
__2.6.2 최악 시간 복잡도와 평균 시간 복잡도
2.7 란다우 빅오 표기법 상세 설명(*)
__2.7.1 란다우 빅오 표기법
__2.7.2 오메가 표기법
__2.7.3 세타 표기법
2.8 마무리
2.9 연습 문제

3장 설계 기법(1): 전체 탐색
3.1 전체 탐색을 배우는 의미
3.2 전체 탐색(1): 선형 탐색법
3.3 선형 탐색법의 응용
__3.3.1 조건을 만족하는 위치 파악 가능
__3.3.2 최솟값 구하기
3.4 전체 탐색(2): 쌍 전체 탐색
3.5 전체 탐색(3): 조합 전체 탐색(*)
3.6 정리
3.7 연습 문제

4장 설계 기법(2): 재귀와 분할 정복법
4.1 재귀란 무엇인가?
4.2 재귀 사용 예(1): 유클리드 호제법
4.3 재귀 사용 예(2): 피보나치 수열
4.4 메모이제이션 동적 계획법
4.5 재귀 사용 예(3): 재귀 함수를 사용한 전체 탐색
__4.5.1 부분합 문제
__4.5.2 부분합 문제에 대한 재귀적 전체 탐색 복잡도(*)
__4.5.3 부분합 문제에 대한 메모이제이션(*)
4.6 분할 정복법
4.7 정리
4.8 연습 문제

5장 설계 기법(3): 동적 계획법
5.1 동적 계획법이란?
5.2 동적 계획법 예제
5.3 동적 계획법 관련 개념도
__5.3.1 완화
__5.3.2 끌기 전이 형식과 밀기 전이 형식
__5.3.3 끌기 전이 형식과 밀기 전이 형식 비교
__5.3.4 전체 탐색 메모이제이션을 이용한 동적 계획법
5.4 동적 계획법 예제(1): 냅색 문제
5.5 동적 계획법 예제(2): 편집 거리
5.6 동적 계획법 예제(3): 구간 분할 최적화
5.7 정리
5.8 연습 문제

6장 설계 기법(4): 이진 탐색법
6.1 배열 이진 탐색
__6.1.1 배열 이진 탐색
__6.1.2 배열 이진 탐색 복잡도(*)
6.2 C++의 std::lower_bound()
6.3 일반화한 이진 탐색법
6.4 좀 더 일반화한 이진 탐색법(*)
6.5 응용 예(1): 나이 맞히기 게임
6.6 응용 예(2): std::lower_bound() 활용
6.7 응용 예(3): 최적화 문제를 판정 문제로 바꾸기
6.8 응용 예(4): 중앙값 구하기
6.9 정리
6.10 연습 문제

7장 설계 기법(5): 탐욕법
7.1 탐욕법이란?
7.2 탐욕법으로 최적해를 구할 수 없는 경우
7.3 탐욕법 패턴(1): 교환해도 악화되지 않음
7.4 탐욕법 패턴(2): 현재가 좋으면 미래도 좋음
7.5 정리
7.6 연습 문제

8장 자료 구조(1): 배열, 연결 리스트, 해시 테이블
8.1 자료 구조를 배우는 의미
8.2 배열
8.3 연결 리스트
8.4 연결 리스트 삽입과 삭제
__8.4.1 연결 리스트 삽입
__8.4.2 연결 리스트 삭제
8.5 배열과 연결 리스트 비교
8.6 해시 테이블
__8.6.1 해시 테이블 만드는 법
__8.6.2 해시 충돌 대책
__8.6.3 해시 테이블 복잡도
__8.6.4 C++와 파이썬의 해시 테이블
__8.6.5 연상 배열
8.7 정리
8.8 연습 문제

9장 자료 구조(2): 스택과 큐
9.1 스택과 큐의 개념
9.2 스택과 큐의 동작과 구현
__9.2.1 스택 동작과 구현
__9.2.2 큐 동작과 구현
9.3 정리
9.4 연습 문제

10장 자료 구조(3): 그래프와 트리
10.1 그래프
__10.1.1 그래프 사고방식
__10.1.2 유향 그래프와 무향 그래프
__10.1.3 워크, 사이클, 패스
__10.1.4 연결성
10.2 그래프를 사용하는 공식화 예시
__10.2.1 소셜 네트워크
__10.2.2 교통 네트워크
__10.2.3 게임 국면 전이
__10.2.4 작업 의존 관계
10.3 그래프 구현
10.4 가중 그래프 구현
10.5 트리
__10.5.1 루트 트리
__10.5.2 부분 트리와 트리 높이
10.6 순서 트리와 이진 트리
__10.6.1 순서 트리와 이진 트리
__10.6.2 강균형 이진 트리
10.7 이진 트리를 사용한 자료 구조 예(1): 힙
__10.7.1 힙이란?
__10.7.2 힙 실현 방법
__10.7.3 힙 쿼리 처리
__10.7.4 힙 구현 예
__10.7.5 O(N) 복잡도로 힙 구축(*)
10.8 이진 트리를 사용하는 자료 구조 예(2): 이진 탐색 트리
10.9 정리
10.10 연습 문제

11장 자료 구조(4): Union-Find
11.1 Union-Find란?
11.2 Union-Find 구조
11.3 Union-Find 복잡도를 줄이는 방법
11.4 Union-Find 개선법 1: union by size
__11.4.1 union by size란?
__11.4.2 union by size 복잡도 분석
11.5 Union-Find 개선법 2: 경로 압축
11.6 Union-Find 구현
11.7 Union-Find 응용: 그래프 연결 요소 개수
11.8 정리
11.9 연습 문제

12장 정렬
12.1 정렬이란?
12.2 정렬 알고리즘의 좋고 나쁨
__12.2.1 in-place와 안정성
__12.2.2 어떤 정렬 알고리즘이 좋은가?
12.3 정렬(1): 삽입 정렬
__12.3.1 동작과 구현
__12.3.2 삽입 정렬 복잡도와 성질
12.4 정렬(2): 병합 정렬
__12.4.1 동작과 구현
__12.4.2 병합 정렬 복잡도와 성질
__12.4.3 병합 정렬 복잡도를 자세히 분석하기(*)
12.5 정렬(3): 퀵 정렬
__12.5.1 동작과 구현
__12.5.2 퀵 정렬 복잡도와 성질
__12.5.3 무작위 선택 퀵 정렬(*)
12.6 정렬(4): 힙 정렬
12.7 정렬 복잡도의 하한값
12.8 정렬(5): 버킷 정렬
12.9 정리
12.10 연습 문제

13장 그래프(1): 그래프 탐색
13.1 그래프 탐색을 배우는 의의
13.2 깊이 우선 탐색과 너비 우선 탐색
13.3 재귀 함수를 사용하는 깊이 우선 탐색
13.4 전위 순회와 후위 순회
13.5 최단 경로 알고리즘으로 너비 우선 탐색
13.6 깊이 우선 탐색과 너비 우선 탐색의 복잡도
13.7 그래프 탐색 예(1): s-t 패스 구하기
13.8 그래프 탐색 예(2): 이분 그래프 판정
13.9 그래프 탐색 예(3): 위상 정렬
13.10 그래프 탐색 예(4): 트리 동적 계획법(*)
13.11 정리
13.12 연습 문제

14장 그래프(2): 최단 경로 문제
14.1 최단 경로 문제란?
__14.1.1 가중치 유향 그래프
__14.1.2 단일 시작점 최단 경로 문제
__14.1.3 음의 변과 음의 닫힌 경로
14.2 최단 경로 문제 정리
14.3 완화
14.4 DAG의 최단 경로 문제: 동적 계획법
14.5 단일 시작점 최단 경로 문제: 벨만-포드 알고리즘
__14.5.1 벨만-포드 알고리즘 아이디어
__14.5.2 벨만-포드 알고리즘 구현
__14.5.3 벨만-포드 알고리즘의 정확성(*)
14.6 단일 시작점 최단 경로 문제: 다익스트라 알고리즘
__14.6.1 두 종류의 다익스트라 알고리즘
__14.6.2 단순한 다익스트라 알고리즘
__14.6.3 다익스트라 알고리즘의 직감적인 이미지
__14.6.4 다익스트라 알고리즘 정확성(*)
__14.6.5 희소 그래프인 경우: 힙을 사용한 고속화(*)
14.7 모든 쌍의 최단 경로 문제: 플로이드-워셜 알고리즘
14.8 참고: 포텐셜과 차분 제약계(*)
14.9 정리
14.10 연습 문제

15장 그래프(3): 최소 신장 트리 문제
15.1 최소 신장 트리 문제란?
15.2 크러스컬 알고리즘
15.3 크러스컬 알고리즘 구현
15.4 신장 트리 구조
__15.4.1 컷
__15.4.2 기본 사이클
__15.4.3 기본 컷 집합
15.5 크러스컬 알고리즘의 정확성(*)
15.6 정리
15.7 연습 문제

16장 그래프(4): 네트워크 흐름
16.1 네트워크 흐름을 배우는 의의
16.2 그래프 연결도
__16.2.1 변 연결도
__16.2.2 최소 컷 문제
__16.2.3 변 연결도를 구하는 알고리즘과 강 쌍대성 증명
16.3 최대 흐름 문제와 최소 컷 문제
__16.3.1 최대 흐름 문제란?
__16.3.2 흐름의 성질
__16.3.3 최소 컷 문제와 쌍대성
__16.3.4 포드-풀커슨 알고리즘
16.4 포드-풀커슨 알고리즘 구현
16.5 응용 예(1): 이분 매칭
16.6 응용 예(2): 점 연결도
16.7 응용 예(3): 프로젝트 선택 문제
16.8 정리
16.9 연습 문제

17장 P와 NP
17.1 문제의 어려움을 측정하는 방법
17.2 P와 NP
17.3 P ≠ NP 문제
17.4 NP 완전
17.5 다항식 시간 환원 예
__17.5.1 꼭짓점 커버 문제
__17.5.2 부분합 문제(*)
17.6 NP 난해
17.7 정지 문제
17.8 정리
17.9 연습 문제

18장 어려운 문제 대책
18.1 NP 난해 문제와 마주하기
18.2 특수한 경우로 풀리는 방법
18.3 탐욕법
18.4 국소 탐색과 담금질 기법
18.5 분기 한정법
18.6 정수계획 문제로 공식화
18.7 근사 알고리즘
18.8 정리
18.9 연습 문제

19장 참고 문헌
19.1 알고리즘 전반
19.2 알고리즘 전반(본격적인 전문서)
19.3 복잡도, P와 NP
19.4 그래프 알고리즘, 조합 최적화
19.5 어려운 문제 대책
19.6 기타 분야

후기
찾아보기

도서소개

 

교환 및 환불안내

도서교환 및 환불
  • ㆍ배송기간은 평일 기준 1~3일 정도 소요됩니다.(스프링 분철은 1일 정도 시간이 더 소요됩니다.)
  • ㆍ상품불량 및 오배송등의 이유로 반품하실 경우, 반품배송비는 무료입니다.
  • ㆍ고객님의 변심에 의한 반품,환불,교환시 택배비는 본인 부담입니다.
  • ㆍ상담원과의 상담없이 교환 및 반품으로 반송된 물품은 책임지지 않습니다.
  • ㆍ이미 발송된 상품의 취소 및 반품, 교환요청시 배송비가 발생할 수 있습니다.
  • ㆍ반품신청시 반송된 상품의 수령후 환불처리됩니다.(카드사 사정에 따라 카드취소는 시일이 3~5일이 소요될 수 있습니다.)
  • ㆍ주문하신 상품의 반품,교환은 상품수령일로 부터 7일이내에 신청하실 수 있습니다.
  • ㆍ상품이 훼손된 경우 반품 및 교환,환불이 불가능합니다.
  • ㆍ반품/교환시 고객님 귀책사유로 인해 수거가 지연될 경우에는 반품이 제한될 수 있습니다.
  • ㆍ스프링제본 상품은 교환 및 환불이 불가능 합니다.
  • ㆍ군부대(사서함) 및 해외배송은 불가능합니다.
  • ㆍ오후 3시 이후 상담원과 통화되지 않은 취소건에 대해서는 고객 반품비용이 발생할 수 있습니다.
반품안내
  • 마이페이지 > 나의상담 > 1 : 1 문의하기 게시판 또는 고객센터 1800-7327
교환/반품주소
  • 경기도 파주시 문발로 211 1층 / (주)북채널 / 전화 : 1800-7327
  • 택배안내 : CJ대한통운(1588-1255)
  • 고객님 변심으로 인한 교환 또는 반품시 왕복 배송비 5,000원을 부담하셔야 하며, 제품 불량 또는 오 배송시에는 전액을 당사에서부담 합니다.