파이썬 데이터 구조와 알고리즘 분석 (2판)
이 책은 파이썬을 사용하여 데이터 구조와 알고리즘을 설명하는 전통적인 교재입니다. 파이썬 기초 복습, 알고리즘 분석(빅오 표기법), 기본 데이터 구조(스택, 큐, 리스트), 재귀, 탐색 및 정렬, 트리 및 그래프 알고리즘 등을 다룹니다. 실전 코드 예제를 통해 파이썬을 활용해 다양한 추상 데이터 유형을 효율적으로 구현하는 방법을 이해하는 데 도움을 줍니다.
강좌 개요
📚 콘텐츠 개요
이 책은 파이썬을 활용하여 데이터 구조와 알고리즘을 설명하는 전통적인 교과서입니다. 파이썬 기초 복습, 알고리즘 분석(빅오 표기법), 기본 데이터 구조(스택, 큐, 리스트), 재귀, 탐색 및 정렬, 트리 및 그래프 알고리즘을 다룹니다. 실전 코드 목록을 통해 독자가 파이썬으로 다양한 추상적 데이터 유형을 효율적으로 구현하는 방법을 이해할 수 있도록 돕습니다.
데이터 구조와 알고리즘을 완전히 이해해야 비로소 파이썬을 진정으로 숙달할 수 있다.
저자: 브래들리 밀러 (미국 루터 대학 컴퓨터 과학 명예 교수), 데이비드 라누움 (IBM 워슨 인지 소프트웨어 엔지니어)
감사의 말: 제1판에 대한 많은 피드백을 제공해 준 동료 스티브 허버드와 신규 자료를 제공해 준 새 판의 편집에 감사를 드립니다. 또한 전 세계의 동료들이 오류를 지적하고 의견을 제시해 주신 점에 깊이 감사드립니다. 디코라 시티의 자바 존스 카페의 메리, 보브 등 직원들에게도 감사합니다. 저희가 휴가 중에도 매장의 '정기 작가'가 되도록 허락해주셔서 고맙습니다. 또한 프랭클린, 비들 & 어소시에이츠 출판사의 직원들(특히 잠 리지와 톰 서머너)과의 즐거운 협업에 감사드립니다. 마지막으로, 저희 두 사람의 아내인 제인 밀러와 브렌다 라누움에게 특별한 감사를 드립니다. 그들의 사랑과 지지는 이 책이 현실이 되도록 해주었습니다.
🎯 학습 목표
- 컴퓨터 과학, 알고리즘, 프로그래밍 간의 관계를 이해하고, 추상적 데이터 유형(ADT)과 정보 은닉의 개념을 습득한다.
- 파이썬 내장 컬렉션 데이터 유형(리스트, 튜플, 세트, 사전)과 제어 구조(반복문, 조건문, 예외 처리)를 능숙하게 사용할 수 있다.
- 파이썬 객체 지향 프로그래밍의 핵심 요소를 익히며, 클래스 정의, 생성자, 연산자 오버로딩(예: 분수 덧셈), 유클리드 알고리즘 적용, 그리고 깊은 복사와 얕은 복사의 차이를 이해한다.
- 알고리즘의 다양한 접근 방식 비교: 동음이의어 검출의 네 가지 방법(세기, 정렬, 폭력적 탐색, 계수)과 각각의 시간 복잡도를 설명할 수 있다.
- 파이썬 컨테이너 성능 측정: 파이썬 리스트(List)와 사전(Dict)의 주요 연산에 대한 빅오 효율을 이해하고,
pop()과pop(i)의 성능 차이를 구분할 수 있다. - 성능 검증 능력:
timeit모듈을 활용하여 이론적 복잡도와 실제 실행 시간의 일치성을 실험적으로 검증할 수 있다. - 선형 데이터 구조(스택, 큐, 덱, 리스트)의 논리적 특성을 이해하고 구분할 수 있다.
- 파이썬 기본 컬렉션(예: 리스트)을 사용하여 사용자 정의 스택, 큐, 덱을 구현할 수 있다.
- 스택이 표현식 처리(중위 표기에서 후위 표기로 변환, 후위 표기 계산)와 큐가 시스템 시뮬레이션(프린터 시뮬레이션)에서 어떻게 활용되는지를 이해한다.
- 재귀의 핵심 세 원칙을 숙지하고, 기본 사례, 상태 변화, 자기 호출을 포함하는 재귀 함수를 정확히 식별하고 작성할 수 있다.
🔹 수업 1: 파이썬 프로그래밍 기초 및 객체 지향 추상화
개요: 본 모듈은 컴퓨터 과학의 기초 이론에서 파이썬 프로그래밍 실습으로 넘어가는 과정을 안내합니다. 먼저 컴퓨터 과학, 알고리즘, 추상적 데이터 유형(ADT)의 핵심 정의를 설정한 후, 파이썬의 내장 컬렉션, 제어 구조, 예외 처리에 대해 깊이 있게 설명합니다. 마지막으로 Fraction 클래스와 '논리 게이트' 상속 계층 구조를 구성함으로써, 객체 지향 프로그래밍(OOP)이 절차적 추상화와 데이터 추상화에 어떻게 강력하게 활용될 수 있는지 보여줍니다.
학습 결과:
- 컴퓨터 과학, 알고리즘, 프로그래밍 간의 관계를 이해하고, 추상적 데이터 유형(ADT)과 정보 은닉의 개념을 습득한다.
- 파이썬 내장 컬렉션 데이터 유형(리스트, 튜플, 세트, 사전)과 제어 구조(반복문, 조건문, 예외 처리)를 능숙하게 사용할 수 있다.
- 파이썬 객체 지향 프로그래밍의 핵심을 익히며, 클래스 정의, 생성자, 연산자 오버로딩(예: 분수 덧셈), 유클리드 알고리즘 적용, 깊은 복사와 얕은 복사의 차이를 이해한다.
🔹 수업 2: 알고리즘 분석 및 파이썬 컨테이너 성능
개요: 본 수업에서는 빅오 표기법을 통해 알고리즘의 효율성을 평가하는 방법을 깊이 있게 탐구하며, "동음이의어 검출" 예제를 통해 O(n!)에서 O(n)까지의 복잡도 진화를 보여줍니다. 동시에 파이썬의 핵심 데이터 구조(리스트와 사전)의 일반적인 연산 성능을 정량적으로 분석함으로써, 개발자가 실제 프로그래밍에서 최적의 컨테이너 선택과 알고리즘 설계를 할 수 있도록 돕습니다.
학습 결과:
- 알고리즘의 다양한 접근 방식 비교: 동음이의어 검출의 네 가지 방법(세기, 정렬, 폭력적 탐색, 계수)과 각각의 시간 복잡도를 설명할 수 있다.
- 파이썬 컨테이너 성능 측정: 파이썬 리스트(List)와 사전(Dict)의 주요 연산에 대한 빅오 효율을 이해하고,
pop()과pop(i)의 성능 차이를 구분할 수 있다. - 성능 검증 능력:
timeit모듈을 활용하여 실험을 설계하고, 이론적 복잡도와 실제 실행 시간의 일관성을 검증할 수 있다.
🔹 수업 3: 기본 선형 구조: 스택, 큐, 링크드 리스트
개요: 본 수업에서는 스택(Stack), 큐(Queue), 덱(Deque), 리스트(List)라는 네 가지 기본 선형 데이터 구조를 깊이 탐구합니다. 선형 구조의 핵심은 항목 간에 상대적인 순서를 유지하는 것이며, 주된 차이는 항목을 추가하거나 제거하는 방식에 있습니다. 파이썬으로 이러한 추상적 데이터 유형(ADT)을 구현함으로써, 학습자는 LIFO(후입선출), FIFO(선입선출) 등의 원칙을 활용하여 표현식 변환, 시스템 시뮬레이션, 링크드 리스트의 메모리 관리와 같은 실제 알고리즘 문제를 해결할 수 있습니다.
학습 결과:
- 선형 데이터 구조(스택, 큐, 덱, 리스트)의 논리적 특성을 이해하고 구분할 수 있다.
- 파이썬 기본 컬렉션(예: 리스트)을 사용하여 사용자 정의 스택, 큐, 덱을 구현할 수 있다.
- 스택이 표현식 처리(중위 표기 → 후위 표기, 후위 표기 계산)와 큐가 시스템 시뮬레이션(프린터 시뮬레이션)에서 어떻게 활용되는지를 이해한다.
🔹 수업 4: 재귀 알고리즘 원리 및 동적 프로그래밍 입문
개요: 본 수업에서는 재귀 알고리즘의 핵심 원리를 깊이 탐구합니다. 기초적인 재귀 세 원칙에서 시작하여, 수치 변환, 프랙탈 기하학, 고전 퍼즐(하노이의 탑, 미로 탐색) 등의 사례를 통해 재귀 호출의 저층 메커니즘—스택 프레임—을 밝혀냅니다. 마지막으로 동적 프로그래밍(Dynamic Programming)의 개념을 소개하며, 기억화 기술을 통해 재귀에서 반복 계산되는 문제를 해결하고, 알고리즘 효율성의 질적 향상을 가능하게 하는 방법을 보여줍니다.
학습 결과:
- 재귀의 핵심 세 원칙을 숙지하고, 기본 사례, 상태 변화, 자기 호출을 포함하는 재귀 함수를 정확히 식별하고 작성할 수 있다.
- 하위 실행 메커니즘을 통찰: 파이썬 호출 스택(스택 프레임)이 재귀 과정에서 로컬 변수와 반환 경로를 어떻게 관리하는지 이해한다.
- 복잡한 문제 모델링 능력: 재귀와 백트래킹 사고를 활용하여 하노이의 탑, 미로 탐색과 같은 비선형 문제를 해결할 수 있다.
🔹 수업 5: 탐색 기술, 해싱 및 정렬 알고리즘
개요: 본 수업 모듈은 컴퓨터 과학에서 핵심적인 데이터 처리 기술인 탐색, 해싱(Hashing), 정렬에 집중합니다. 순차 탐색부터 효율적인 이진 탐색에 이르기까지 다루며, 해시 테이블(Hash Tables)의 구조 원리, 충돌 해결 방법, 그리고 맵(Map) 추상적 데이터 유형의 구현을 깊이 있게 탐색합니다. 동시에 버블 정렬, 쉘 정렬, 병합 정렬의 알고리즘 논리와 성능 특성을 자세히 분석합니다.
학습 결과:
- 순차 탐색과 이진 탐색의 적용 시나리오와 시간 복잡도(O(n) vs O(\log n))를 이해하고 비교할 수 있다.
- 해시 함수 설계(접합법, 제곱 중심법) 및 충돌 처리 메커니즘(선형 탐사, 제곱 탐사, 연결법)을 이해한다.
- 수동으로 시뮬레이션하고 프로그래밍으로 구현할 수 있으며, 버블 정렬, 쉘 정렬, 병합 정렬을 이해하고 분할 정복 전략이 정렬에 어떻게 적용되는지 설명할 수 있다.
🔹 수업 6: 트리 구조: 이진 힙, 탐색 트리 및 균형 트리 (AVL)
개요: 본 수업에서는 컴퓨터 과학에서 가장 핵심적인 데이터 구조인 트리에 대해 깊이 탐구합니다. 기본 용어와 이진 트리의 구현을 시작으로, 점차 고급 응용으로 진전됩니다. 표현식 해석 트리와 그 탐색 방법을 포함합니다. 이후에는 우선순위 큐에 사용되는 이진 힙과 효율적인 탐색에 적합한 이진 탐색 트리(BST)의 두 가지 효율적인 변형을 배웁니다. 마지막으로 AVL 트리에 대해 연구하며, 회전 연산을 통해 균형 인자를 유지하여, 최악의 경우에서의 성능 저하 문제를 해결합니다.
학습 결과:
- 트리의 핵심 용어(루트, 간선, 경로, 높이 등)를 정확히 정의하고 이진 트리의 재귀적 성질을 설명할 수 있다.
- 파이썬으로 이진 힙, 이진 탐색 트리, AVL 트리의 핵심 알고리즘(삽입, 삭제, 회전, 재균형화)을 구현할 수 있다.
- 세 가지 트리 순회 알고리즘을 수행하고 해석할 수 있으며, 해석 트리를 활용하여 수학 표현식을 처리할 수 있다.
🔹 수업 7: 그래프 알고리즘: 탐색, 최단 경로, 최소 신장 트리
개요: 본 수업에서는 그래프 이론의 기초 이론과 파이썬에서의 효율적 구현을 깊이 탐구합니다. 그래프의 추상적 데이터 유형(인접 행렬과 인접 리스트), 기초 탐색 알고리즘(BFS와 DFS)과 그 고전적인 응용 사례를 다룹니다. 마지막으로 가중치가 있는 그래프에서의 최단 경로(Dijkstra) 및 최소 신장 트리(Prim) 알고리즘으로 발전합니다.
학습 결과:
- 그래프의 두 가지 주요 표현 방식(인접 행렬과 인접 리스트)의 성능과 적용 시나리오를 이해하고 비교할 수 있다.
- 너비 우선 탐색(BFS)과 깊이 우선 탐색(DFS)의 알고리즘 원리를 이해하고, 경로 탐색 및 순회 문제를 해결할 수 있다.
- 그래프 알고리즘을 활용하여 복잡한 논리적 의존성(위상 정렬)과 네트워크 연결성(강결합 컴포넌트, 최소 신장 트리) 문제를 해결할 수 있다.
🔹 수업 8: 전문 주제 복습: RSA 암호화, 스킵리스트, 옥타리스 색상 양자화
개요: 본 수업에서는 컴퓨터 과학에서 기본 데이터 구조에서 복잡한 알고리즘으로의 응용 전이를 깊이 탐구합니다. 파이썬 리스트(ArrayList)의 내부 구현과 평균 분석, RSA 암호화를 지원하는 수론적 재귀 알고리즘, 사전 검색 속도를 향상시키는 스킵리스트 구축, 그리고 옥타리스를 이용한 디지털 이미지 색상 양자화의 원리를 다룹니다.
학습 결과:
- ArrayList의 메모리 배열 구조와 평균 분석(Amortized Analysis)의 수학적 도출 과정을 이해한다.
- RSA 암호화의 핵심 수학 원리를 이해하며, 동치론, 거듭제곱 나머지, 확장 유클리드 알고리즘을 포함한다.
- 스킵리스트의 계층 구조, 확률적 생성 과정, 그리고 O(\log n)의 검색 효율을 설명할 수 있다.