[서평/협업제안] 가장 쉬운 독학 알고리즘 첫걸음 파이썬편

teo.yu·2022년 6월 2일
15
post-thumbnail

출판사 동양북스 온라인 마케팅팀 담당자입니다.
최근 코딩에 관심이 있어지면서, velog를 자주 들어가서 글을 보곤 했는데요.
teo.yu님이 개발 분야에 대한 정보와 지식들을 작성한 게시물이 유익하고 도움이 많이 되어서 지금까지 잘 보고 있습니다 ㅎㅎ

다름이 아니라 저희 동양북스에서 이번에 개발 분야 신간인 <가장 쉬운 독학 알고리즘 첫걸음 파이썬편> 책이 5월 출간되었습니다.

이 책은 전통적인 알고리즘을 배우는 책이자 파이썬 프로그래밍의 입문서입니다.
따라서 파이썬 프로그래밍에 관심이 있어 하시는 분들께 이 책을 소개해드리면 좋을 것 같아 협업 제안 드립니다!😊

프롤로그

동양북스에서 협업 제안을 주셨습니다. 프론트엔드 개발자로써 파이썬 책에 대해서 서평을 작성해보는 것에 대해서는 다소 고민이 있었습니다만 찾아보니 목차나 구성이 괜찮아보였기에 기꺼이 수락을 하고 난 뒤 책을 읽어보았습니다.

프론트엔드와 무관하게 요새 취업을 위한 코딩테스트나 알고리즘이나 자료구조등을 공부하는 과정에서 비전공자가 처음 입문을 하는데 어려움이 겪는 이야기를 듣게 되다보니 언어보다는 알고리즘 설명에 관해서 내용적으로 괜찮다면 충분히 서평을 써봄직하지 않을까 생각을 해봤습니다.

출판사의 제안으로 시작하였으나 충분히 주관적인 내용이라는 점 기억하고 읽어주시면 좋을 것 같아요. :)


이렇게 생긴 책입니다.

목차 👍

우선 이 책에 대해서 괜찮다고 느낀 부분이 바로 목차의 구성이었습니다. 비전공자의 경우 인터넷등을 통해서 알고리즘을 공부하려고 하면 어떻게 해야할지 막막한 부분이 있기 마련입니다. 목차의 구성이 괜찮기 때문에 알고리즘을 독학 하실때에는 아래 키워드와 순서를 따라서 차근차근 익히시면 좋을 것 같아요.

복잡도와 정렬에 관한 이야기는 저도 글을 한번 쓴 바 있는데요. 제 글은 알고리즘 공부에 대한 동기부여에 대한 이야기라면 본격적으로 이론공부를 하기 위해서는 아래 목차와 키워드에 대해서 알아두시면 좋을 것 같아요.

프론트엔드 개발자에게 알고리즘 공부가 미치는 영향

https://velog.io/@teo/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C-%EA%B0%9C%EB%B0%9C%EC%9E%90%EC%97%90%EA%B2%8C-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EA%B3%B5%EB%B6%80%EA%B0%80-%EB%AF%B8%EC%B9%98%EB%8A%94-%EC%98%81%ED%96%A5

책의 구매 여부를 떠나서 알고리즘 공부를 독학해보겠다고 하신다면 아래 목차에 나오는 키워드들이 좋은 참고자료가 될거라고 생각해서 목차를 쭉 공유해봅니다.

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

... 이건 중요하지 않아서 생략하겠습니다.

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 고급 알고리즘 배우기

이 책으로 어떻게 공부를 하면 좋을까?

일단 책 목차가 괜찮고 입문용으로 최대한 쉽게 적으려고 했던 것 같아요. 저는 알고 있는 내용이라서 쉬워보이는 걸 수도 있어서 마냥 쉽다고 말을 하기는 그렇지만 차근차근 잘 설명을 하고 있는 것 같아요. 실제 코딩은 이론이 아니라 실전이기 때문에 이론을 깊게 알고 있다고 바로 실력으로 연결이 되지는 않습니다. 또한 지금은 언제든지 검색이 가능한 시대에 살고 있기 때문에 필요할 때 검색을 할 수 있는 키워드를 알고 있는 것이 훨씬 더 중요합니다.

그러니 가벼운 마음으로 저자가 알려주고 싶은 내용들을 이해가 잘 안가더라도 가볍게 머리속에 담아보시고 키워드와 복잡도 그리고 각 알고리즘마다의 목적과 컨셉을 중점으로 기억해두시면 좋을 것 같아요. 그리고 최대한 그림으로 기억해보려고 하세요

알고리즘의 이름은 무엇이고 무엇을 해결하고자 하는 것이며 그래서 어떤식으로 접근을 하고자 했는가? 어떤 형태의 자료구조를 가지고 있는지 그림으로 이해하기

이미지 출처: https://visualgo.net/en
그림으로 알려주는 알고리즘 사이트인데 영어라서 더 어렵다ㅠㅠ

파이썬책인데 프론트엔드에게 괜찮을까요?

비슷한 유형의 javascript로 되어 있는 책이 있을까? 찾아 봤는데 없더라구요. 프론트엔드 코딩테스트의 경우 javascript로 보는 것을 추천드리기 때문에 python으로 코드를 작성해보는 것보다는 javascript로 작성을 해보시는 것을 추천드립니다.

사실 알고리즘용으로만 봤을때는 javascript나 python이나 언어가 크게 다르지 않습니다. 오히려 생각없이 예제코드를 타이핑을 해서 잘 모르면서 일단 그대로 따라치고 마치 안듯한 착각을 하는 것보다는 제시된 python코드를 한번 javascript로 포팅을 하는 방식으로 공부를 해보는 것은 어떨까 하는 제안을 드려봅니다. 익숙한것을 한번 비틀어서 내것으로 만드려는 시도를 하면 훨씬 더 분명하게 학습이 된다고 하더라구요.

그리고 각 장 끝마다 연습을 할 수 있는 문제들이 있습니다. 해당 문제는 javascript로 충분히 풀어볼 수 있지 않을까요?

끝으로...

출판사 제안으로 시작된 서평이라서 알고리즘이라는 기준을 두고 여러가지 책을 비교평가하면서 쓴 리뷰는 아닙니다. 하지만 비전공자이며 알고리즘이나 자료구조 코딩테스트를 하기 전에 이론공부를 가볍게 입문을 하려고 하신다면 추천은 드릴 수 있다고 생각합니다. 특히 앞에서 언급했지만 목차와 구성이 괜찮은 편이라서 머리속에 전체적인 그림과 키워드를 기억해두지 좋은 구성이라고 생각합니다. 이후 더 본격적으로 잘 이해가 안되거나 자료가 부족하다고 생각하는 부분은 검색을 통해서 또 공부를 하시면 될 것 같아요.

결국 이론보다는 실전이기에 javascript로 주어진 문제들을 풀어가면서 알고리즘을 어떻게 적용을 하는지 연습이 되었다면 본격 코딩 테스트 사이트를 통해서 또 많은 실습을 해보시길 바랍니다. 실전이나 코딩테스트는 이론을 확인하는 예제식으로 제출하지는 않을테니까요.

알고리즘, 코딩테스트를 공부하시는 분들 모두 모두 화이팅입니다!

profile
AdorableCSS를 개발하고 있는 시니어 프론트엔드 개발자입니다. 궁금한 점이 있다면 아래 홈페이지 버튼을 클릭해서 언제든지 오픈채팅에 글 남겨주시면 즐겁게 답변드리고 있습니다.

0개의 댓글