『한입 CS』와 『한입 알고리즘』을 읽다 보면 수학이 불쑥 끼어든다. 부동소수점 장에는 2⁻⁴가, 이분 탐색 장에는 log₂n이, 정렬 장에는 O(n log n)이, 해시 장에는 key % size가 나온다. 식 하나가 막히면 그 장의 나머지가 다 흐려진다. 지금 이 식들을 못 읽어도 된다. 그것이 이 책이 푸는 것이다.
이 책은 그렇게 막히는 수학만 모았다. 2진수와 16진수, 로그, 증가 속도, 합 공식, 나머지 연산, 경우의 수, 점화식, 확률, 집합과 논리, 그래프 용어까지 열 가지다. 미적분과 선형대수는 다루지 않는다. 두 책을 읽는 데는 필요하지 않다.
공식을 외우게 하지 않는다. 식을 쓰면 바로 옆에 그 식을 말로 읽는 법과 숫자 예 하나를 붙인다. 예를 들어 log₂8 = 3이면 "8을 2로 세 번 나누면 1이 된다"고 읽는다. 그리고 그 식이 코드에서 어떻게 생기는지 코드 추적으로 따라가거나, 입력을 바꿔 가며 숫자와 그림이 어떻게 달라지는지 실험으로 본다. 코드 추적은 코드를 한 줄씩 실행하며 변수가 어떻게 바뀌는지 보는 블록이고, 실험은 코드 없이 버튼과 슬라이더로 입력을 바꾸는 블록이다. 코드를 줄마다 읽는 것보다 그림 하나가 빨리 읽히는 자리(반씩 줄이기, 생일 확률, 해시 충돌 등)는 실험으로 보여 준다. 예제는 TypeScript와 Python 두 가지로 적었고, 코드 위의 언어 버튼으로 바꾸면 책 전체의 예제가 고른 언어로 보인다.
이 책은 처음부터 끝까지 읽는 책이 아니라 곁에 두는 책이다. 먼저 아래 진단 테스트를 풀고, 틀린 문제의 Unit만 골라 읽는다. 『한입』 두 권을 읽다가 막혀서 왔다면 두 번째 절의 표에서 그 장에 맞는 Unit을 찾아 바로 가도 된다. 『한입』 각 장 맨 위의 "읽기 전에" 상자도 그 장에 필요한 Unit을 알려 준다.
세 권을 처음부터 함께 읽고 싶다면, 수학을 그 수학이 처음 쓰이는 장 바로 앞에 끼워 읽는 순서를 권한다. 각 Unit은 알고리즘을 몰라도 읽히게 썼고, 알고리즘과 이어지는 이야기는 Unit 끝의 "쓰이는 곳"에 모았다.
| 단계 | 『개발 수학』 | 이어서 읽을 장 |
|---|---|---|
| 1 | Unit 1 | 『한입 CS』 0장~3장 |
| 2 | Unit 2~4 | 『한입 알고리즘』 0장, 『한입 CS』 4장 |
| 3 | Unit 5 | 『한입 CS』 5장 |
| 4 | Unit 6, 8 | 『한입 알고리즘』 1장~3장 |
| 5 | Unit 10 | 『한입 알고리즘』 4장~6장 |
| 6 | Unit 7 | 『한입 알고리즘』 7장~11장 |
| 7 | Unit 9 | 『한입 CS』 6장~10장 |
수학이 싫어진 사람이 이 책을 읽는다고 생각하고 썼다. 그래서 몇 가지를 약속한다. 식이 나오면 바로 옆에 말로 읽는 법과 숫자 예를 둔다. 예측 문제는 모르면 찍어도 되고, 틀린 답과 그 뒤의 해설이 맞힌 답보다 오래 남는다. 답과 진행 기록은 이 브라우저에만 저장되고 누구에게도 보이지 않는다. 시간 제한은 없다. 외워야 할 공식은 없고, 공식이 나오면 왜 그렇게 되는지를 코드를 한 줄씩 돌려 가며 본다.
진단 테스트
문제 번호가 곧 Unit 번호다. 계산기 없이 머릿속이나 종이로 풀고, 모르는 문제도 비워 두지 말고 가장 그럴듯한 것을 고른다. 다 풀면 다음 절의 표에서 틀린 문제의 Unit을 확인한다.
1. 0xFF는 10진수로 얼마일까?
2. n = 1024로 시작해 while (n > 1) n = Math.floor(n / 2)를 돌리면 반복문은 몇 번 돌까?
3. for (let i = 0; i < n; i++) for (let j = 0; j < n; j++) work()에서 n이 10배가 되면 work()가 불리는 횟수는 몇 배가 될까?
4. for (let i = 0; i < 5; i++) for (let j = i + 1; j < 5; j++) compare(i, j)에서 compare는 모두 몇 번 불릴까?
5. JavaScript에서 -1 % 3은 -1이다. Python에서 -1 % 3은 얼마일까?
6. [a, b, c, d]에서 원소를 골라 만들 수 있는 부분집합은 빈 것까지 모두 몇 개일까?
7. 계단을 한 번에 1칸 또는 2칸씩 오른다. 계단 4칸을 오르는 방법은 몇 가지일까? (1칸이면 1가지, 2칸이면 2가지다. 틀려도 된다. Unit 7에서 푸는 문제다)
8. 한 방에 23명이 있다. 생일이 같은 두 사람이 적어도 한 쌍 있을 확률은 대략 얼마일까? (1년은 365일, 생일은 고르게 퍼져 있다고 친다)
9. !(a && b)와 언제나 같은 값을 내는 식은?
10. 노드 5개로 된 트리에는 간선이 몇 개 있을까?
틀린 문제는 여기로
| 문제 | 다루는 수학 | Unit |
|---|---|---|
| 1 | 2진수(binary)·16진수(hexadecimal), 비트(bit)와 바이트(byte) | Unit 1. 2진수와 16진수: 0xFF는 왜 255일까 |
| 2 | 로그(logarithm): 1이 될 때까지 2로 몇 번 나누나 | Unit 2. 로그: 10억 개에서 30번 만에 찾는 이유 |
| 3 | 증가 속도(growth rate)와 Big-O | Unit 3. 증가 속도: n, n log n, n², 2ⁿ |
| 4 | 합 공식: 1 + 2 + … + (n − 1) | Unit 4. 합 공식: 이중 루프는 왜 n²일까 |
| 5 | 나머지 연산(modulo)과 음수 | Unit 5. 나머지 연산: 음수의 나머지는 언어마다 다르다 |
| 6 | 경우의 수(counting)와 부분집합(subset) | Unit 6. 경우의 수: 모든 경우를 훑는 코드는 왜 금방 느려질까 |
| 7 | 점화식(recurrence relation) | Unit 7. 점화식: 앞 답으로 다음 답 만들기 |
| 8 | 확률(probability)과 생일 역설(birthday paradox) | Unit 8. 확률: 23명이면 생일이 겹친다 |
| 9 | 논리 연산(logical operation)과 드모르간 법칙(De Morgan's laws) | Unit 9. 집합과 논리: 드모르간과 JOIN |
| 10 | 그래프(graph)와 트리(tree) | Unit 10. 그래프 용어: 정점, 간선, 트리, DAG |
다 맞혔어도 Unit 2와 3은 한 번 훑어보기를 권한다. 두 책에 가장 자주 나오는 것이 로그와 O(n log n) 같은 Big-O 표기(입력이 커질 때 일이 늘어나는 모양만 남겨 적는 법, 빅오 표기법 노트)다. 맞힌 이유를 말로 설명할 수 있는지 확인하는 데 몇 분이면 된다.
『한입』 두 권을 읽다가 막혀서 왔다면 이 표에서 찾는다.
| 막힌 장 | 막히는 자리 | 갈 Unit |
|---|---|---|
| 『한입 CS』 0장 부동소수점 | 2진 소수, 2⁻⁴ 같은 지수 | Unit 1 3절 |
| 『한입 CS』 1장 문자와 바이트 | 16진수, 바이트 | Unit 1 |
| 『한입 CS』 8장 데이터베이스 | B-트리 높이와 로그, 뿌리·잎 | Unit 2, Unit 10 |
| 『한입 CS』 9장 코드 실행 | AST(트리) | Unit 10 |
| 『한입 알고리즘』 0장 Big-O | n²과 n의 차이, 1 + 2 + 4 + … | Unit 3, Unit 4 |
| 『한입 알고리즘』 1장 해시 | key % size, 충돌 | Unit 5, Unit 8 |
| 『한입 알고리즘』 4장 BFS, 9장 위상 정렬, 11장 트라이 | 노드·간선, 진입 차수, 순환, DAG, 트리 | Unit 10 |
| 『한입 알고리즘』 5장 DFS와 백트래킹 | 옵션 조합의 개수 | Unit 6 |
| 『한입 알고리즘』 6장 이분 탐색 | log₂n | Unit 2 |
| 『한입 알고리즘』 7장 정렬 | O(n log n) | Unit 2, Unit 3 |
| 『한입 알고리즘』 8장 힙 | 트리 높이 log n | Unit 2, Unit 10 |
| 『한입 알고리즘』 10장 동적 계획법 | 앞 답으로 다음 답을 채우는 식 | Unit 7 |
Unit 하나의 모양
모든 Unit은 같은 순서로 짜여 있다.
- 장면: 일상이나 실무 코드 한 줄에서 "이 식이 왜 이렇지?"를 던진다. 알고리즘을 몰라도 읽히는 장면이다.
- 코드 추적과 실험: 결과를 먼저 예측한 뒤, 코드를 한 줄씩 실행하거나 실험에서 입력을 바꿔 가며 답을 확인한다.
- 식과 말: 코드 추적이나 실험에서 본 것을 식으로 적고, 식마다 말로 읽는 법과 숫자 예를 붙인다. 수학과 코드가 어디서 같고 어디서 다른지는 '수학 다리' 상자로 견준다.
- 함정 찾기: AI가 짠 코드나 설명에서 틀린 줄을 고른다. 공식을 잘못 옮긴 코드는 오류 없이 틀린 값을 낸다.
- 연습: 몇 문제를 풀어 본다.
- 쓰이는 곳: 그 수학이 나오는 『한입』 장으로 가는 링크와, 그 장의 어느 자리에서 나오는지 한 줄씩.
- 더 풀어 보기(선택): 조금 어려운 문제 하나가 장 끝에 한 줄로 접혀 있다. 건너뛰고 다음 Unit이나 읽던 『한입』 장으로 가도 된다. 펼치면 힌트를 하나씩 열어 가며 풀고, 풀이도 코드 추적으로 확인한다.
한 Unit은 15분 안팎이다. 막힌 장을 읽기 직전에 해당 Unit 하나를 읽고 돌아가면 그 장의 식이 읽힌다.
0xFF가 왜 255인지, 2진수와 16진수부터 봅니다.