가장 쉬운 독학 알고리즘 첫걸음 : 파이썬편 - 코딩 테스트에 대비하는 25가지 기초 알고리즘과 최적화 가장 쉬운 독학 알고리즘 첫걸음
마스이 도시카츠 지음, 박광수 옮김 / 동양북스(동양문고) / 2022년 5월
평점 :
장바구니담기


#가장쉬운독학알고리즘첫걸음파이썬편 #동양북스 #마스이도시카츠 #박광수 #알고리즘 #코딩 #서평 #서평이벤트 #서평단 #프로그래밍 #프로그래머 #IT

나는 데이터분석에 관심이 많고 데이터 분석한 것을 사람들에게 보여주는 홈페이지/앱/프로그램을 만들고 싶은 마음이 있다. 하지만 알고리즘이 부족해 좋은 코드를 만들지 못해 구현한 프로그램이 느리고 비효율적이다. 그래서 알고리즘 공부가 부족하다고 느끼고 있었다. 그러다 동양북스 출판사 인스타그램에서 서평 이벤트를 진행하고 있는 <가장 쉬운 독학 알고리즘 첫걸음 파이썬편> 도서를 보게 되었다. 알고리즘이 공부가 필요한 나는 이 책으로 알고리즘을 공부해 좋은 코드를 짜서 빠르고 깔끔한 프로그램을 만들어보고 싶어서 이 책의 서평 이벤트를 신청하고 당첨되어 책을 받게 되었다.

책의 저자-마스이 도시카츠

마스이 기술사 사무소 대표. 정보 공학 부문 기술사이며 정보 처리 기술자 시험에도 다수 합격했습니다. 비즈니스 수학 검정 1급에 합격하고 공익 재단 법인 일본 수학 검정 협회 인정 트레이너로도 활동 중입니다. 비즈니스와 수학 그리고 IT를 조합하여 컴퓨터를 효율적으로 사용하기 위한 지원 및 각종 소프트웨어 개발, 데이터 분석 등을 실시하고 있습니다. 저서로는 『그림으로 배우는 프로그래밍 구조』, 『그림으로 배우는 보안 구조』, 『프로그래밍 언어 도감』(이상 영진닷컴), 『잠자는 코딩 브레인을 깨우는 알고리즘 퍼즐 69』, 『코딩의 수학적 기초를 다지는 알고리즘 퍼즐 68』(이상 프리렉), 『이토록 쉬운 딥러닝을 위한 기초 수학 with 파이썬』(루비페이퍼), 『IT용어 도감』(성안당) 등이 있습니다.

옮긴이-박광수

박광수라는 이름보다 ‘아크몬드’라는 필명으로 더 잘 알려진 블로거입니다. 2004년부터 지금까지 최신 윈도우 정보를 꾸준히 나누고 있습니다. 지금까지 7회 마이크로소프트 MVP(Windows 부문)를 수상하기도 했습니다. 마이크로소프트 365, 애저(Azure) 등 마이크로소프트의 최신 기술에 열광합니다. 심리학에 관심이 많으며 현재 일본에서 개발자로 일하면서 딥러닝에 많은 관심을 두고 있습니다.

지은 책으로는 『윈도우 10 마스터북』, 옮긴 책으로는 『만들면서 배우는 파이토치 딥러닝』, 『파이썬으로 배우는 딥러닝 교과서』, 『파이썬으로 배우는 머신러닝의 교과서』, 『처음 배우는 딥러닝 수학』(이상 한빛미디어), 『가장 쉬운 독학 알고리즘 첫걸음: C&자바편』, 『캐글 가이드』(이상 동양북스) 등이 있습니다.

책의 목차

1장 파이썬의 기본 및 자료구조 알아보기

1.1 프로그래밍 언어 선택

1.1.1 목적에 따라 프로그래밍 언어 선택하기

1.1.2 파이썬을 선택하는 이유

1.1.3 프로그램 실행 방식의 차이 알아보기

1.2 파이썬 개요

1.2.1 파이썬의 특징

1.2.2 파이썬 실행하기

1.2.3 대화형 모드로 파이썬 사용

1.2.4 스크립트 파일로 저장

1.2.5 문자 인코딩에 주의하기

1.2.6 주석

1.3 사칙 연산과 우선순위

1.3.1 파이썬의 기본 계산

1.3.2 소수 계산

1.3.3 자료형 확인

1.4 변수, 대입, 리스트, 튜플

1.4.1 변수

1.4.2 대입

1.4.3 리스트

1.4.4 튜플

1.5 문자와 문자열

1.5.1 문자와 문자열 다루기

1.5.2 문자열 연결

1.6 조건 분기와 반복

1.6.1 조건 분기

1.6.2 긴 줄의 작성 방법

1.6.3 반복

1.7 리스트 내포

1.7.1 리스트 생성

1.7.2 조건을 지정해 리스트 생성

1.8 함수와 클래스

1.8.1 함수 작성

1.8.2 값에 의한 전달과 참조에 의한 전달

1.8.3 변수의 유효 범위

1.8.4 객체 지향과 클래스

2장 기본적인 프로그램 작성하기

2.1 순서도 그리기

2.1.1 처리의 흐름 표현하기

2.1.2 자주 쓰이는 기호 배우기

2.1.3 간단한 순서도 그리기

2.2 FizzBuzz 구현하기

2.2.1 코딩 테스트에 자주 나오는 문제

2.2.2 3의 배수일 때 ‘Fizz’ 출력

2.2.3 5의 배수일 때 ‘Buzz’ 출력

2.2.4 3과 5의 공배수일 때 ‘FizzBuzz’ 출력

2.3 자판기에서 거스름돈 계산하기

2.3.1 거스름돈의 매수를 최소화하려면?

2.3.2 거스름돈 계산

2.3.3 리스트와 반복문으로 프로그램을 간단하게 만들기

2.3.4 잘못된 입력에 대응하기

2.4 기수 변환

2.4.1 10진수와 2진수

2.4.2 10진수를 2진수로 변환

2.4.3 2진수를 10진수로 변환

2.5 소수 판정하기

2.5.1 소수를 구하는 방법

2.5.2 소수인지 알아보는 프로그램 만들기

2.5.3 빠르게 소수를 구하는 방법 고려하기

2.6 피보나치 수열 만들기

2.6.1 피보나치 수열이란?

2.6.2 피보나치 수열을 프로그램으로 구하기

2.6.3 메모이제이션으로 처리 속도 향상시키기

3장 복잡도 학습하기

3.1 계산 비용, 실행 시간, 시간 복잡도

3.1.1 좋은 알고리즘이란?

3.1.2 프로그램을 작성해 처리 시간 측정하기

3.1.3 알고리즘의 성능을 평가하는 복잡도

3.1.4 FizzBuzz 복잡도 알아보기

3.1.5 곱셈 복잡도 알아보기

3.1.6 부피를 구하는 복잡도 알아보기

3.1.7 복잡도 비교하기

3.1.8 최악 시간 복잡도와 평균 시간 복잡도

3.2 자료구조에 따른 복잡도 차이

3.2.1 연결 리스트의 개념

3.2.2 연결 리스트 삽입하기

3.2.3 연결 리스트 삭제하기

3.2.4 연결 리스트 읽기

3.2.5 리스트와 연결 리스트의 구분

3.3 알고리즘 복잡도와 문제 복잡도

3.3.1 복잡도 클래스

3.3.2 지수 시간 알고리즘

3.3.3 계승을 계산하는 알고리즘

3.3.4 어려운 P ≠ NP 예상

4장 다양한 검색 방법 배우기

4.1 선형 검색

4.1.1 일상에서의 검색

4.1.2 프로그래밍의 검색

4.1.3 선형 검색 함수 정의하기

4.2 이진 검색

4.2.1 검색 범위를 반으로 나누기

4.2.2 데이터 증가 시 비교 횟수 고려하기

4.3 트리 구조 탐색

4.3.1 계층 구조 데이터의 검색 고려하기

4.3.2 너비 우선 탐색 구현하기

4.3.3 깊이 우선 탐색 구현하기

4.4 다양한 예제 구현하기

4.4.1 미로 탐험(보초병) 문제

4.4.2 8퀸 문제

4.4.3 n퀸 문제

4.4.4 하노이의 탑

4.4.5 폴더에서 다른 폴더나 파일 찾기

4.4.6 틱택토

5장 데이터 정렬에 걸리는 시간 비교하기

5.1 일상생활에서의 정렬

5.1.1 정렬이 필요한 상황

5.1.2 정렬 알고리즘을 배우는 이유

5.2 선택 정렬

5.2.1 작은 요소 고르기

5.2.2 선택 정렬의 구현

5.2.3 선택 정렬의 복잡도

5.3 삽입 정렬

5.3.1 정렬된 리스트에 데이터 추가하기

5.3.2 뒤에서부터 데이터 이동하기

5.3.3 삽입 정렬 구현하기

5.3.4 삽입 정렬의 복잡도

5.4 버블 정렬

5.4.1 이웃끼리 데이터 교환하기

5.4.2 버블 정렬 구현하기

5.4.3 버블 정렬 개선하기

5.5 힙 정렬

5.5.1 리스트를 효율적으로 사용하는 자료구조 알아보기

5.5.2 마지막에 넣은 데이터부터 꺼내는 스택

5.5.3 스택 구현하기

5.5.4 처음에 넣은 데이터부터 꺼내는 큐

5.5.5 큐 구현하기

5.5.6 트리 구조로 표현하는 힙

5.5.7 힙에 요소 추가하기

5.5.8 힙에서 요소 꺼내기

5.5.9 힙의 구성에 걸리는 시간

5.5.10 힙 정렬 구현하기

5.5.11 범용적인 힙 정렬 구현하기

5.5.12 라이브러리 활용

5.6 병합 정렬

5.6.1 리스트를 분할한 후 병합해 정렬하기

5.6.2 병합 정렬 구현하기

5.6.3 병합 정렬의 복잡도

5.7 퀵 정렬

5.7.1 분할한 각 리스트 안에서 정렬하기

5.7.2 퀵 정렬 구현하기

5.7.3 퀵 정렬의 복잡도

5.8 처리 속도 비교하기

5.8.1 복잡도 비교하기

5.8.2 실제 데이터로 비교하기

5.8.3 안정 정렬

6장 실무에 도움되는 알고리즘 알아보기

6.1 최단 경로 문제

6.1.1 수치화한 비용을 생각하기

6.1.2 모든 경로 조사하기

6.1.3 그래프를 만들어 생각하기

6.2 벨만-포드 알고리즘

6.2.1 변의 가중치에 주목하기

6.2.2 초깃값으로 무한대 설정하기

6.2.3 비용 갱신하기

6.2.4 프로그램 작성하기

6.2.5 벨만-포드 알고리즘에서 주의할 점

6.3 데이크스트라 알고리즘

6.3.1 정점에 주목해 최단 경로 찾기

6.3.2 데이크스트라 알고리즘 구현하기

6.3.3 복잡도를 생각하여 처리 속도 향상하기

6.3.4 힙에 의한 우선순위가 있는 큐 구현하기

6.3.5 데이크스트라 알고리즘에서 주의할 점

6.4 A* 알고리즘

6.4.1 불필요한 경로를 최대한 탐색하지 않기

6.4.2 비용의 추정값 고려하기

6.4.3 A* 알고리즘 구현하기

6.5 완전 탐색 알고리즘

6.5.1 인덱스가 없는 문자열에서 특정 문자열 찾기

6.5.2 일치하는 문자 위치를 앞에서부터 찾기

6.5.3 완전 탐색 알고리즘 구현하기

6.6 보이어-무어 알고리즘

6.6.1 완전 탐색 알고리즘의 문제점

6.6.2 문자열 끝부터 비교해 패턴에 포함되지 않는 문자 건너뛰기

6.6.3 처리 시간 비교하기

6.7 역폴란드 표기법

6.7.1 연산자를 앞에 놓는 폴란드 표기법

6.7.2 연산자를 뒤에 두는 역폴란드 표기법

6.8 유클리드 호제법

6.8.1 최대공약수를 효율적으로 구하기

6.8.2 고급 알고리즘 배우기

부록 A 파이썬 개발 환경 구축하기

A.1 파이썬의 처리 시스템 알아보기

A.2 파이썬 개발 환경 설치하기

A.2.1 윈도우에 설치하는 경우

A.2.2 macOS에 설치하는 경우

A.3 아나콘다로 파이썬 설치하기

A.3.1 윈도우에 설치하는 경우

A.3.2 macOS에 아나콘다 설치하기

A.4 파이썬 가상 환경 만들기

A.5 여러 버전의 파이썬으로 전환하기

A.6 패키지 설치 및 삭제

A.7 파일이나 프로그램을 실행할 때 문제가 발생하는 경우

부록 B 이해도 Check! 정답

책의 목차

책의 특징

이 책은 파이썬의 기초와 알고리즘의 기초라는 두 개의 지식을 설명하는 책으로 파이썬으로 알고리즘의 흐름을 이해할 수 있는 순서도를 제시해 설명한다. 전통적인 알고리즘을 배우며 파이썬 프로그래밍의 입문서이다. 컴퓨터공학과에서 수행하는 알고리즘 수업과 비슷하다. 순서도를 보면서 알고리즘을 살펴본 후 파이썬 코드로 구현한다. 1장에서는 파이썬의 개요와 문법, 실행 방법 등을 설명해준다. (변수, 리스트, 튜플, 문자열, 반복, 함수 등) 2장에서는 간단한 프로그램을 몇 개 작성하고 순서도(알고리즘)와 파이썬 구현을 설명해준다. (자판기 거스름돈 계산, 에레토스테네스의 체, 피보나치수열 등) 3장에서는 복잡도의 개념을 살펴보고 여러 구현 중에서 최적 알고리즘을 선택하는 것의 중요성을 설명해준다. (시간 복잡도, 공간 복잡도, 평균시간복잡도 등) 4장에서는 많은 데이터 중에서 원하는 데이터를 찾는 "탐색"의 전통적인 방법들을 설명하고 비교한다. (선형검색, 이진 검색, 너비 우선 탐색 등) 5장에서는 주어진 데이터를 고속으로 정렬하는 다양한 방법을 설명하고 정렬 속도와 구현 방법을 비교한다. (선택 정렬, 버블 정렬, 병합 정렬 등) 6장에서는 실무에서 자주 사용되는 알고리즘을 소개하고 스스로 구현할 수 있도록 개념을 설명해준다. (벨만-포드 알고리즘, 보이어-무어 알고리즘, 데이크스트라 알고리즘) 마지막 7장은 부록으로 파이썬 설치 방법과 함께 각 장의 마지막에 실린 연습 문제의 해설을 해준다.

책의 장점

이 책은 프로그래밍(코딩)과 알고리즘의 초보자에게 유용한 책으로 비전공자인 나도 따라 할 수 있었다. 다양한 알고리즘에 대해서 배울 수 있었고 수학과 관련된 지식도 얻을 수 있었다. 시중의 다른 책들은 코드만 있어서 코드를 잘 이해하지 못하고 따라 치기만 한 경우가 많았는데 이 책은 코드를 치기 전에 순서도가 적혀있어서 코드가 무슨 의미인지 이해하기가 쉬웠다. 순서도로 인해서 알고리즘의 흐름이 어떻게 흘러가는지 알 수 있었다. 또 이 책은 같은 문제를 여러 가지 방식으로 해결할 수 있을 때, 어떤 방식을 선택하느냐에 따라 코드의 길이와 시간 복잡도가 크게 달라지는 것을 보여준다. 이로인해 더 나은 알고리즘을 찾기 위한 노력이 중요하다는 것을 알게 되어서 알고리즘 공부의 중요성을 알게 되어 알고리즘 공부를 더욱더 하게 만든다. 책 앞에는 학습 진도표가 있어서 공부 계획을 세우는 데 도움을 주고 목차마다 이해도 Check! 칸이 있는데 이해도 Check! 칸은 각 장에서 배운 내용을 다시 생각하는 데 도움을 준다.

학습 진도표가 있어서 공부 계획을 세울 때 도움이 된다.

순서도가 있어서 코드를 이해하기 쉽다.

이해도 check! 칸이 목차마다 있어서 배운 내용을 다시 한번 생각해 볼 수 있다.

책의 후기

이 책으로 알고리즘의 기초를 공부하고 알고리즘의 중요성을 크게 느끼게 되었다. 앞으로 알고리즘 공부를 게을리하지 말고 다른 책으로도 적극적으로 알고리즘 공부를 열심히 해야겠다고 생각하게 되었다.

프로그래밍에서 알고리즘은 중요하지만 어려워서 포기하는 사람들이 많다고 한다. 그런 사람들은 이 책으로 다시 한번 알고리즘 공부를 해보면 어떨까 생각해본다. 비전공자인 나 같은 사람도 책을 완독했으니, 초보자들도 충분히 할 수 있다고 생각한다. 이 책은 다른 책들과 달리 코드만 적혀있지않고 순서도가 있어서 코드를 쉽게 이해할 수 있었다. 앞으로 프로그래밍 관련 책을 구매한다면 이 책처럼 순서도가 많이 적혀있는 책을 위주로 구매하는 것이 좋을 것 같다.



댓글(0) 먼댓글(0) 좋아요(0)
좋아요
북마크하기찜하기 thankstoThanksTo