상세 컨텐츠

본문 제목

파이썬으로 익히는 말랑말랑 알고리즘

전체 출간 도서

by 비제이퍼블릭 2022. 1. 10. 16:34

본문

파이썬으로 익히는 말랑말랑 알고리즘

부제 차근차근 설명하고 막힘없이 이해하는 알고리즘

저자 김경록

출판사 비제이퍼블릭

출간/배본가능일 2022년 01월 26일

정가 30,000 

페이지 448

판형 크라운판 (173 * 230)

ISBN 979-11-6592-106-4 (93000)

 

책 소개 

처음 코딩 테스트를 준비하는 초보자도 어려움없이 배우는 알고리즘 도서!

 

1. 이론과 예제 문제 모두, 초보자를 위해 차근차근!

탄탄하게 알고리즘 이론을 배우고, 제대로 이해했는지 확인할 수 있는 예제 문제가 준비되어 있습니다. 알고리즘 이론은 대충 이해했는데 예제 문제가 갑자기 어려워져서 책으로 공부하기 힘들었다고요? 도서 파이썬으로 익히는 말랑말랑 알고리즘≫은 예제 문제도 초보자들을 위해 첫 단계부터 차근차근 풀어갑니다. 그동안 알고리즘에 패배감을 느껴왔던 독자분께 이 도서를 추천합니다.

 

2. 반복, 반복, 또 반복! 알고리즘이 익숙해질 때까지!

무엇이든 제대로 습득하기 위해선, 반복의 과정이 있어야 합니다.

제대로 소화할 때까지 반복하며 단계 별로 차분히 풀어갑니다. 이 과정을 통해 알고리즘을 여러분의 것으로 만들어 가세요.

 

3. 계속해서 발전시켜가는 코드 작성법. 첫 술에 배 부르랴!

첫 코드로 속도, 적은 메모리 공간, 깔끔한 변수, 이 모든 것을 고려할 수 없습니다. 처음엔 투박하게 작성된 코드를 계속해서 다듬고 발전시켜서 멋진 코드로 완성해 가는 거죠! 이 과정을 단계별로 하나하나 전부 담았습니다. 첫술에 배 부르랴! 여러 번 떠먹으면서 배 부르게 알고리즘을 소화시킬 수 있도록 돕는 도서, 지금 당장 알고리즘을 시작하세요! 

 

 

 

저자 소개 

김경록

백엔드 개발자로 다양한 프로젝트에 참여하다, 현재는 오픈소스 컨설팅 전문기업 OSC Korea에서 마이크로서비스 아키텍처(MSA) 컨설턴트로 즐겁게 일하고 있습니다. 개발자로서 새로운 기술을 익히고 이를 전파하여 한국 개발자 커뮤니티의 성장과 한국 IT업계의 파이를 키우는 데 관심이 있습니다.

블로그와 유튜브 채널 <뷰티풀 프로그래밍>을 운영하고 있습니다.

 

목차

1. 알고리즘이란?

1.1. 알고리즘을 공부하는 이유

1.2. 알고리즘이 어려운 이유

1.3. 코딩 테스트 준비의 시작

1.4. 코딩 테스트를 보는 이유

1.5. 좋은 알고리즘이란?

1.6. 알고리즘을 잘하는 개발자가 좋은 개발자인가요?

1.7. 이 책의 목표

 

2. 아는 것 같지만 떠올리기 어려운 기술들

2.1. 글자 개수만큼 배열 만들기

2.1.1. len()으로 개수 세기

2.1.2. 반복문을 이용해 개수만큼 반복하기

2.1.3. 인덱스로 배열에 접근하기

2.1.4. 인덱스로 배열에 값 넣기

2.1.5. 빈 리스트에 인덱스로 접근하기

2.1.6. 빈 리스트에 값 할당하기

2.1.7. append()로 값 초기화하기

2.1.8. None 100개 들어 있는 리스트 만들기

2.2. 리스트 안의 숫자 개수 세기

2.3. 자리 바꾸기 swap

2.4. 배열의 인덱스 값 바꾸기

2.5. 중복 제거하기

2.5.1. (Set)이란?

2.5.2. ListSet으로 바꾸기

2.6. (empty) 리스트([])에서 값을 뽑게 될 때

 

3. 입문용 알고리즘

3.1. 짝수, 홀수 구하는 함수 만들기

3.1.1. ‘%’ 연산자로 나머지 구하기

3.1.2. 구한 나머지를 이용해 짝수, 홀수 판단하기

3.2. 배수인지 알아보기

3.2.1. 배수(multiple)?

3.2.2. ‘%’ 연산자로 나머지 구하기

3.2.3. 배수인지 아닌지 True, False로 나오게 하기

3.3. 자릿수들의 합 구하기

3.3.1. ‘/’ 연산자로 몫 구하기

3.3.2. ‘//’ 연산자로 몫 구하기

3.3.3. 10으로 나누어 보기

3.3.4. 한 번 더 몫과 나머지 구하기

3.3.5. 1의 자리만 있는 숫자를 10으로 나누기

3.3.6. 반복문 넣기

3.3.7. quotient() 변수 빼기

3.3.8. remainder(나머지) 변수 빼기

3.4. 최댓값(max), 최솟값(min) 구하기

3.4.1. 핵심 로직

3.4.2. 반복문으로 숫자 하나씩 확인하기

3.4.3. result 변수 선언하기

3.4.4. 최댓값 교체하는 로직 넣기

3.4.5. 음수가 주어졌을 때 문제점

3.4.6. 변수 result의 초기값 설정

3.4.7. 불필요한 연산 제거

3.4.8. 최댓값이 들어있는 인덱스(Index) 출력하기

3.4.9. Index를 리턴하도록 로직 변경하기

3.4.10. Index에 있는 값들 비교

3.4.11. 개선할 부분

3.4.12. 최솟값 구하기

 

4. 무차별 대입법[Brute Force]

4.1. 통장 비밀번호 풀기

4.2. 통장 비밀번호 푸는 알고리즘 개발하기

4.3. 핵심 로직

4.3.1. 0000부터 0009까지(0 0 0 h)

4.3.2. 0000부터 0099까지(0 0 h j)

4.3.3. 0000부터 0999까지(0 h j i)

4.3.4. 0000부터 9999까지(h j i k)

4.3.5. 입력받은 암호와 같으면 return

 

5. 스택[Stack]

5.1. 스택(Stack)은 처음부터 있었을까요?

5.1.1. 스택(Stack)을 쓰는 이유

5.1.2. 위 구조의 문제점

5.1.3. 스택(Stack) 연산 사용 방법

5.1.4. 스택(Stack) 구현하기

5.1.5. .pop() 구현하기

5.1.6. 스택이 비었을 때 .pop()의 기능 수정

5.1.7. .empty() 구현하기

5.1.8. .peek() 구현하기

5.2. 괄호 문제 풀기

5.2.1. 괄호 문제 풀기 전에 알아둘 것

5.2.2. 스택(Stack)을 안 쓰고 괄호 풀기

5.2.3. 문자열 빼기

5.2.4. 반복문 적용

5.2.5. 문자열 빼는 로직 붙이기

5.2.6. s의 값 업데이트

5.2.7. breck 적용

5.2.8. 얼마나 반복해야 할까요? – while 적용

5.2.9. .split(‘()’), ‘’.join 적용

5.2.10. 함수로 만들기

5.2.11. 스택(Stack)을 꼭 사용해야 하나요?

5.3. 스택을 이용해 괄호 문제 풀기

5.3.1. 핵심 로직

5.3.2. st.push() 이용하기

5.3.3. Stack1 클래스 파일로 분리하기

5.3.4. .pop()하기

5.3.5. 닫는 괄호 ‘)’부터 나올 때의 처리

5.3.6.. 함수로 만들기

5.3.7. 속도 테스트

5.3.8. 더 빠르게 하는 방법

5.4. {}, []도 있는 경우

5.4.1. 스택을 사용하지 않았을 때 속도 테스트

5.4.2. 정규식을 쓰는 경우 속도가 더 빠를까요?

5.4.3.. 스택으로 구현하기

5.4.4. 스택에서 꺼내는 .pop() 조건

5.4.5. 짝이 맞는 괄호인지 판단하기

 

6. 해시[Hash]

6.1. 해시의 탄생

6.2. 해시 구현

6.3. 해시 테이블 구현

6.4. 해시 충돌(Hash Collision)

6.5. 오픈 어드레싱(Open addressing)

6.6. 체이닝(Chaining)

6.7. 완주하지 못한 선수

 

7. 소수[Prime]

7.1. 단순하게 구하기  

7.1.1. n % I 구하기

7.1.2. 조건문 적용

7.2. 에라토스테네스의 체

7.2.1. 1 지우기

7.2.2. 2의 배수 지우기

7.2.3. 3의 배수 지우기

7.2.4. 4의 배수 지우기

7.2.5. 5의 배수 지우기

7.2.6. 6의 배수 지우기

7.2.7. 7의 배수 지우기

7.3. 에라토스테네스 체 알고리즘 구현하기

7.3.1. 2부터 n까지 숫자가 들어있는 배열 만들기

7.3.2. 배수 반복문 만들기

7.3.3. 뒤에서부터 반복하기

7.3.4. 나누어 떨어지면 지우기

7.3.5. 함수로 만들기

7.3.6. 속도 문제

7.3.7. while문을 이용한 속도 개선

7.4. 숫자를 지우지 않는 에라토스테네스의 체

7.4.1. check 배열 만들기

7.4.2. while문으로 반복하기

7.4.3. ns[i]의 배수를 False로 표시하기

7.4.4. 반복문 시작 숫자를 식(Statement)으로

7.4.5. 체에 친 결과 출력하기

7.4.6. 함수로 만들기, 속도 테스트

7.4.7. 중복으로 처리되는 값들에 대해

 

8. 단순 탐색(Simple Search)과 이진 탐색(Binary Search)

8.1. 심플 서치(Simple Search) – 단순 탐색

8.2. 바이너리 서치(Binary Search) – 이진 탐색

8.2.1. 중간값(mid index) 찾기

8.2.2. 중간에 있는 값과 찾고자 하는 값 비교하기

8.2.3. 중간값이 대상값보다 작을 때, 클 때

8.2.4. 찾을 때까지 반복하기

8.2.5. 코드 정리 & 찾는 값이 없을 때

8.2.6. 최종 코드 정리

 

9. 정렬[Sort]

9.1. 버블정렬

9.1.1. 대상 배열 선언하고 결과 쓰기

9.1.2. 첫 번째와 두 번째 값 뽑기

9.1.3. 자리 바꾸기

9.1.4. 배열에 적용하기

9.1.5. 4번째 숫자와 비교하기

9.1.6. 변수 대신 인덱스로 변경

9.1.7. for문 적용하기

9.1.8. 배열 크기에 따라 실행 횟수 바뀌게 하기

9.1.9. 중첩 for문 적용하기

9.1.10. 배열에 숫자가 추가되어도 정렬이 잘 되게 하기

9.2. 퀵정렬

9.2.1. 퀵정렬이 빠른 이유

9.2.2. 퀵정렬 구현하기

 

10. 재귀[Recursive]

10.1. 1에서 100까지 loop문 안 쓰고 출력하기

10.1.1. 1에서 100까지 loop문으로 반복하기

10.1.2. 파라미터 만들기

10.1.3. 자신을 호출하도록 만들기

10.1.4. 파라미터에 값 넘겨주기

10.1.5. 탈출 조건 넣기

10.1.6. 1씩 커지는 로직 넣기

10.1.7. 정리하기

10.2. 리턴(return) 값이 있는 재귀 배열의 모든 값 sum하기

10.2.1. 배열에서 인덱스로 값 뽑아서 더하기

10.2.2. 변수 사용하기

10.2.3. arr.pop() 이용해서 맨 뒤의 값 뽑아내기

10.2.4. pop 한 번 더 사용하기

10.2.5. 재귀 호출하기

10.2.6. 쌓이는 부분 만들기 accu

10.2.7. 탈출 조건 적용하기

10.2.8. accu에 뽑은 값을 더하는 로직

10.2.9. 소스코드 정리하기

10.3. 팩토리얼(Factorial) – 재귀 호출의 과정

10.3.1. 재귀로 팩토리얼 구하기

10.4. 피보나치 수열 만들기

10.4.1. 피보나치 수열의 인덱스

10.4.2. 피보나치 수열 구현하기

10.4.3. 3번째 값을 넣는 부분 반복하기

10.4.4. 연산 반복하기

10.4.5. 한 개의 숫자를 리턴하도록 바꾸기

10.5. 재귀로 피보나치 수열 만들기

10.5.1. return에서 재귀 호출

10.5.2. 탈출 조건 만들기

10.6. 최대공약수 구하기(GCD : Greatest Common Divisor)

10.6.1. gcd(a,a) = a 로직 추가하기

10.6.2. a > b 일 때, gcd(a, b) = gcd(a – b, b) 로직 추가하기

10.6.3. a < b 일 때, gcd(a, b) = gcd(a, b – a) 로직 추가하기

 

11. 다이내믹 프로그래밍[Dynamic Programming]

11.1. LCS(Longest Common Subsequence)

11.1.1. LCS 핵심 로직

11.1.2. i = 0일 때 (DABCDCBA 비교)

11.1.3. i = 1일 때 (DCABCDCBA 비교)

11.1.4. i = 2일 때 (DCAABCDCBA 비교)

11.1.5. i = 3일 때 (DCABABCDCBA 비교)

11.1.6. i = 4일 때 (DCABDABCDCBA 비교)

11.1.7. i = 5일 때 (DCABDCABCDCBA 비교)

11.1.8. 코드로 구현하기

11.1.9 메모(memo) 배열 만들기

11.1.10. 비교할 문자열 하나씩 보기

11.1.11. 비교하면서 메모장에 기록하기

11.2. 최적의 전략(Optimal Strategy) 찾기

11.2.1. 가장 큰 숫자 가지고 오기

11.2.2. 더 좋은 방법 찾아보기

11.2.3. 알고리즘 구현하기

11.2.4. 숫자가 3개 있는 경우

11.2.5. 40을 가지고 오게 된 이유

11.2.6. 2를 가지고 오는 경우

11.2.7. 40을 가지고 오는 경우

11.2.8. 7, 40, 19에서 최적의 선택은?

11.2.9. 2, 7, 40, 19에서 최적의 선택은?

11.2.10. 2, 7, 40, 4, 9에서 최적의 선택은?

11.2.11. dp[1][3] 구하기

11.2.12. 식으로 j = 2, j = 3일 때 결과 구하기

11.2.13. 숫자를 4개 사용하는 경우

11.2.14. 코드로 구현하기

11.2.15. 함수 선언하고 n 구하기

11.2.16. 4 x 4의 표 만들기(dp)

11.2.17. 숫자가 1개만 있는 경우

11.2.18. 숫자가 3개 이상인 경우

11.3. 최소 비용 경로(Min Cost Path)

11.3.1. 최소 비용 어떻게 구할까요?

11.3.2. 단계별로 기록하기

11.3.3. 코드로 최소 비용 알고리즘 구현하기

11.3.4. 첫 번째 칸에 표시하는 로직

11.3.5. 첫 번째 줄에 표시하는 로직

11.3.6. j = 0일 때 처리하기

11.3.7. I > 0 and j > 0일 때 처리하기

 

출판사 리뷰 

알고리즘이 매번 새롭게 느껴진다면?

슬기로운 코딩 생활을 위한 기본서를 소개합니다.

 

매번 공부할 때마다 새롭게 느껴지는 알고리즘. 우리 머리가 나쁜 걸까요? 아니요, 전혀 그렇지 않습니다. 알고리즘은 이해하고 풀어보고 코드를 좀 더 발전시키는 과정을 계속해서 반복해야 합니다. 그 반복의 시간이 지났을 때, 여러분은 더 이상 알고리즘이 낯설게 느껴지지 않는 것을 경험할 것입니다.

 

코딩 테스트를 준비해야 하지만, 엄두조차 내지 못하셨다고요?

그런 여러분을 위해 알고리즘을 이해하고 문제를 풀고, 발전시키는 이 반복의 과정을 여러분과 함께 하겠습니다. 지금 파이썬으로 익히는 말랑말랑 알고리즘으로 여러분의 슬기로운 코딩 생활을 만들어 가세요.

 

관련글 더보기

댓글 영역