코딩 테스트를 위한 자료 구조와 알고리즘 with C++
67개 문제 풀이로 익히는 C++ 자료 구조와 알고리즘!
코딩 테스트 준비 및 최신 C++ 문법으로 알고리즘을 학습하자!
C++ 자료 구조부터 그리디 알고리즘, 분할 정복 알고리즘, 그래프 알고리즘, 동적 계획법과 같은 다양한 알고리즘을 설명한다. 또한, 전통적인 자료 구조와 C++ STL 클래스 구현 사이의 관계를 설명해 주어진 문제에 가장 적합한 자료 구조를 선택할 수 있도록 도와준다. 이론을 익힌 후 44개 연습 문제와 23개 실습 문제로 직접 코딩해보며 체계적으로 학습할 수 있게 구성되어 있다. 코딩 테스트를 준비하는 취업 준비생과 최신 C++ 문법으로 알고리즘을 새로 공부하려는 사람들에게 추천한다.
«코딩 테스트를 위한 자료 구조와 알고리즘 with C++»는 1~3장을 공개합니다.
전자책 구입
목차
- 1장 리스트, 스택, 큐
- 1.1 들어가며
- 1.2 연속된 자료 구조와 연결된 자료 구조
- 1.2.1 연속된 자료 구조
- 1.2.2 연결된 자료 구조
- 1.2.3 비교
- 1.2.4 C 스타일 배열의 제약 사항
- 1.3 std::array
- 1.3.1 연습 문제 1: 동적 크기 배열 구현하기
- 1.3.2 연습 문제 2: 빠르고 범용적인 데이터 저장 컨테이너 만들기
- 1.4 std::vector
- 1.4.1 std::vector - 가변 크기 배열
- 1.4.2 std::vector 할당자
- 1.5 std::forward_list
- 1.5.1 std::forward_list에서 원소 삽입과 삭제
- 1.5.2 std::forward_list의 기타 멤버 함수
- 1.5.3 연습 문제 3: 연결 리스트에서 remove_if() 함수를 이용한 조건부 원소 삭제
- 1.6 반복자
- 1.6.1 연습 문제 4: 다양한 반복자에서 이동하기
- 1.6.2 연습 문제 5: 기본적인 사용자 정의 컨테이너 만들기
- 1.6.3 실습 문제 1: 음악 재생 목록 구현하기
- 1.7 std::list
- 1.7.1 std::list 멤버 함수
- 1.7.2 연습 문제 6: std::list의 삽입 또는 삭제 함수 사용하기
- 1.7.3 양방향 반복자
- 1.7.4 반복자 무효화
- 1.7.5 실습 문제 2: 카드 게임 시뮬레이션
- 1.8 std::deque
- 1.8.1 덱의 구조
- 1.9 컨테이너 어댑터
- 1.9.1 std::stack
- 1.9.2 std::queue
- 1.9.3 std::priority_queue
- 1.9.4 어댑터 반복자
- 1.10 벤치마킹
- 1.10.1 실습 문제 3: 사무실 공유 프린터의 인쇄 대기 목록 시뮬레이션
- 1.11 나가며
- 2장 트리, 힙, 그래프
- 2.1 들어가며
- 2.2 비선형 문제
- 2.2.1 계층적 문제
- 2.2.2 순환 종속성
- 2.3 트리: 상하 반전된 형태
- 2.3.1 연습 문제 7: 조직도 구조 만들기
- 2.3.2 트리 순회
- 2.3.3 연습 문제 8: 레벨 순서 순회 구현하기
- 2.4 다양한 트리 구조
- 2.4.1 이진 검색 트리
- 2.4.2 트리 연산의 시간 복잡도
- 2.4.3 연습 문제 9: BST 구현하기
- 2.4.4 균형 트리
- 2.4.5 N-항 트리
- 2.4.6 실습 문제 4: 파일 시스템 자료 구조 만들기
- 2.5 힙
- 2.5.1 힙 연산
- 2.5.2 연습 문제 10: 중앙값 구하기
- 2.5.3 실습 문제 5: 힙을 이용한 데이터 리스트 병합
- 2.6 그래프
- 2.6.1 인접 행렬로 그래프 표현하기
- 2.6.2 연습 문제 11: 그래프를 구성하고 인접 행렬로 표현하기
- 2.6.3 인접 리스트로 그래프 표현하기
- 2.6.4 연습 문제 12: 그래프를 구성하고 인접 리스트로 표현하기
- 2.7 나가며
- 3장 해시 테이블과 블룸 필터
- 3.1 들어가며
- 3.2 해시 테이블
- 3.2.1 해싱
- 3.2.2 연습 문제 13: 정수 값을 저장하는 간단한 사전
- 3.3 해시 테이블에서 충돌
- 3.3.1 체이닝
- 3.3.2 연습 문제 14: 체이닝을 사용하는 해시 테이블
- 3.3.3 열린 주소 지정
- 3.3.4 뻐꾸기 해싱
- 3.3.5 연습 문제 15: 뻐꾸기 해싱
- 3.4 C++ 해시 테이블
- 3.4.1 연습 문제 16: STL에서 제공하는 해시 테이블
- 3.4.2 실습 문제 6: 긴 URL을 짧은 URL로 매핑하기
- 3.5 블룸 필터
- 3.5.1 연습 문제 17: 블룸 필터 만들기
- 3.5.2 실습 문제 7: 이메일 주소 중복 검사
- 3.6 나가며
- 4장 분할 정복
- 4.1 들어가며
- 4.2 이진 검색
- 4.2.1 연습 문제 18: 이진 검색 구현 및 성능 평가
- 4.2.2 실습 문제 8: 예방 접종
- 4.3 분할 정복 이해하기
- 4.4 분할 정복을 이용한 정렬 알고리즘
- 4.4.1 병합 정렬
- 4.4.2 연습 문제 19: 병합 정렬
- 4.4.3 퀵 정렬
- 4.4.4 연습 문제 20: 퀵 정렬
- 4.4.5 실습 문제 9: 부분 정렬
- 4.4.6 선형 시간 선택
- 4.4.7 연습 문제 21: 선형 시간 선택
- 4.5 분할 정복 기법과 C++ 표준 라이브러리 함수
- 4.6 맵리듀스: 더 높은 추상화 레벨의 분할 정복 기법
- 4.6.1 맵과 리듀스 추상화
- 4.6.2 연습 문제 22: C++ 표준 라이브러리를 이용하여 맵과 리듀스 구현하기
- 4.6.3 맵리듀스 프레임워크를 이용한 부분 통합
- 4.6.4 연습 문제 23: 맵리듀스를 사용하여 소수 확인하기
- 4.6.5 실습 문제 10: 맵리듀스를 이용하여 워드카운트 구현하기
- 4.7 나가며
- 5장 그리디 알고리즘
- 5.1 들어가며
- 5.2 기본적인 그리디 알고리즘
- 5.2.1 최단 작업 우선 스케줄링
- 5.2.2 연습 문제 24: 최단 작업 우선 스케줄링
- 5.3 배낭 문제
- 5.3.1 0-1 배낭 문제
- 5.3.2 분할 가능 배낭 문제
- 5.3.3 연습 문제 25: 분할 가능 배낭 문제
- 5.3.4 실습 문제 11: 작업 스케줄링 문제
- 5.3.5 그리디 알고리즘의 요구 조건
- 5.3.6 최소 신장 트리 문제
- 5.3.7 디스조인트-셋 자료 구조
- 5.3.8 연습 문제 26: 크루스칼 MST 알고리즘
- 5.4 그래프 컬러링
- 5.4.1 연습 문제 27: 그리디 그래프 컬러링
- 5.4.2 실습 문제 12: 웰시-포웰 알고리즘
- 5.5 나가며
- 6장 그래프 알고리즘 I
- 6.1 들어가며
- 6.2 그래프 순회 문제
- 6.2.1 너비 우선 탐색
- 6.2.2 연습 문제 28: BFS 구현하기
- 6.2.3 깊이 우선 탐색
- 6.2.4 연습 문제 29: DFS 구현하기
- 6.2.5 실습 문제 13: 이분 그래프 판별하기
- 6.3 프림의 최소 신장 트리 알고리즘
- 6.3.1 연습 문제 30: 프림 알고리즘 구현하기
- 6.4 다익스트라 최단 경로 알고리즘
- 6.4.1 연습 문제 31: 다익스트라 알고리즘 구현하기
- 6.4.2 실습 문제 14: 뉴욕에서 최단 경로 찾기
- 6.5 나가며
- 7장 그래프 알고리즘 II
- 7.1 들어가며
- 7.2 최단 경로 문제 다시 살펴보기
- 7.3 벨만-포드 알고리즘
- 7.3.1 연습 문제 32: 벨만-포드 알고리즘 구현하기
- 7.4 벨만-포드 알고리즘과 음수 가중치 사이클
- 7.4.1 연습 문제 33: 음수 가중치 사이클 찾기
- 7.4.2 실습 문제 15: 욕심쟁이 로봇
- 7.5 존슨 알고리즘
- 7.5.2 실습 문제 16: 무작위 그래프 통계
- 7.5.1 연습 문제 34: 존슨 알고리즘 구현하기
- 7.6 강한 연결 요소
- 7.6.1 방향 그래프와 무방향 그래프에서 연결성
- 7.7 코사라주 알고리즘
- 7.7.1 연습 문제 35: 코사라주 알고리즘 구현하기
- 7.7.2 실습 문제 17: 미로-순간이동 게임
- 7.8 적절한 방법 선택하기
- 7.9 나가며
- 8장 동적 계획법 I
- 8.1 들어가며
- 8.2 동적 계획법이란?
- 8.3 메모이제이션: 하향식 접근 방법
- 8.4 타뷸레이션: 상향식 접근 방법
- 8.5 부분집합의 합 문제
- 8.5.1 1단계: 동적 계획법 필요조건 분석하기
- 8.5.2 2단계: 기저 조건과 상태 정의하기
- 8.5.3 2-(a)단계: 전수 조사
- 8.5.4 연습 문제 36: 전수 조사 방식으로 부분집합의 합 문제 풀기
- 8.5.5 2-(b)단계: 최적화 적용하기 - 백트래킹
- 8.5.6 연습 문제 37: 백트래킹을 사용하여 부분집합의 합 문제 풀기
- 8.5.7 3단계: 메모이제이션
- 8.5.8 연습 문제 38: 메모이제이션을 이용하여 부분집합의 합 문제 풀기
- 8.5.9 4단계: 타뷸레이션
- 8.5.10 연습 문제 39: 타뷸레이션을 이용하여 부분집합의 합 문제 풀기
- 8.5.11 실습 문제 18: 여행 경로
- 8.6 문자열과 시퀀스에 대한 동적 계획법
- 8.6.1 최장 공통 부분 시퀀스 문제
- 8.6.2 연습 문제 40: 전수 조사 방식으로 최장 공통 부분 시퀀스 문제 풀기
- 8.6.3 최적화 첫 단계: 최적 부분 구조 찾기
- 8.6.4 실습 문제 19: 메모이제이션을 이용하여 최장 공통 부분 시퀀스 찾기
- 8.6.5 하향식에서 상향식으로 바꾸기: 메모이제이션 방식을 타뷸레이션 방식으로 바꾸기
- 8.6.6 실습 문제 20: 타뷸레이션을 이용하여 최장 공통 부분 시퀀스 찾기
- 8.7 실습 문제 21: 멜로디 순열
- 8.8 나가며
- 9장 동적 계획법 II
- 9.1 들어가며
- 9.2 P와 NP
- 9.3 부분집합의 합 문제 다시 보기
- 9.4 배낭 문제
- 9.4.1 0-1 배낭 문제 - 부분집합의 합 문제 확장하기
- 9.4.2 연습 문제 41: 0-1 배낭 문제
- 9.4.3 무한 개수 배낭 문제
- 9.4.4 상태 공간 축소
- 9.4.5 연습 문제 42: 무한 개수 배낭 문제
- 9.4.6 실습 문제 22: 최대 이익
- 9.5 그래프와 동적 계획법
- 9.5.1 벨만-포드 알고리즘 다시 보기
- 9.5.2 동적 계획법으로 최단 경로 문제 다루기
- 9.5.3 연습 문제 43: 단일 시작 최단 경로(메모이제이션)
- 9.5.4 모든 쌍 최단 경로
- 9.5.5 플로이드-워셜 알고리즘
- 9.5.6 연습 문제 44: 플로이드-워셜 알고리즘 구현하기
- 9.5.7 실습 문제 23: 도로 건설
- 9.6 나가며
- 부록 실습 문제 풀이
- A.1 1장 리스트, 스택, 큐
- A.1.1 실습 문제 1: 음악 재생 목록 구현하기
- A.1.2 실습 문제 2: 카드 게임 시뮬레이션
- A.1.3 실습 문제 3: 사무실 공유 프린터의 인쇄 대기 목록 시뮬레이션
- A.2 2장 트리, 힙, 그래프
- A.2.1 실습 문제 4: 파일 시스템 자료 구조 만들기
- A.2.2 실습 문제 5: 힙을 이용한 데이터 리스트 병합
- A.3 3장 해시 테이블과 블룸 필터
- A.3.1 실습 문제 6: 긴 URL을 짧은 URL로 매핑하기
- A.3.2 실습 문제 7: 이메일 주소 중복 검사
- A.4 4장 분할 정복
- A.4.1 실습 문제 8: 예방 접종
- A.4.2 실습 문제 9: 부분 정렬
- A.4.3 실습 문제 10: 맵리듀스를 이용하여 워드카운트 구현하기
- A.5 5장 그리디 알고리즘
- A.5.1 실습 문제 11: 작업 스케줄링 문제
- A.5.2 실습 문제 12: 웰시-포웰 알고리즘
- A.6 6장 그래프 알고리즘 I
- A.6.1 실습 문제 13: 이분 그래프 판별하기
- A.6.2 실습 문제 14: 뉴욕에서 최단 경로 찾기
- A.7 7장 그래프 알고리즘 II
- A.7.1 실습 문제 15: 욕심쟁이 로봇
- A.7.2 실습 문제 16: 무작위 그래프 통계
- A.7.3 실습 문제 17: 미로-순간이동 게임
- A.8 8장 동적 계획법 I
- A.8.1 실습 문제 18: 여행 경로
- A.8.2 실습 문제 19: 메모이제이션을 이용하여 최장 공통 부분 시퀀스 찾기
- A.8.3 실습 문제 20: 타뷸레이션을 이용하여 최장 공통 부분 시퀀스 찾기
- A.8.4 실습 문제 21: 멜로디 순열
- A.9 9장 동적 계획법 II
- A.9.1 실습 문제 22: 최대 이익
- A.9.2 실습 문제 23: 도로 건설