20강 / 20강
알고리즘 고르기 — 느릴 때 무엇을 먼저 볼까
측정 · 병목 · 처방, 그리고 전 19강의 정리
드디어 마지막 강입니다. 지금까지 배운 것을 현장에서 쓰는 순서로 정리해 봅시다.
"사이트가 느려요"라는 신고를 받았습니다. 무엇부터 해야 할까요?
어디를 고칠지 잘못 고르면 노력이 통째로 낭비됩니다.
Python
브라우저에서 실행
느릴 때 확인하는 순서
| # | 확인 | 발견되면 | 관련 강 |
|---|---|---|---|
| 1 | 어느 요청이 느린가 (p95·p99 로그) | 범위를 좁힌다 | 19강 |
| 2 | DB 쿼리가 몇 번 나가는가 | N+1 문제 → 딕셔너리로 합치기 | 8강 |
| 3 | 조회 컬럼에 인덱스가 있는가 | Full Scan O(n) → 인덱스 O(log n) | 5강 |
| 4 | 같은 계산을 반복하는가 | 캐시 · 메모이제이션 | 13·16강 |
| 5 | 이중 반복문이 있는가 | O(n²) → 해시나 정렬로 낮추기 | 3·6·8강 |
| 6 | 전부 정렬하고 앞 몇 개만 쓰는가 | 힙 Top-N | 10강 |
| 7 | 대기열이 계속 쌓이는가 | 처리기 증설 · 유입 제한 | 11·17강 |
위에서부터 순서대로 보세요. 대부분 3번 안에 답이 나옵니다.
자료·연산별 도구 요약표
| 하고 싶은 일 | 도구 | 비용 | 강 |
|---|---|---|---|
| 열쇠 하나로 정확히 찾기 | 딕셔너리 · 집합 | O(1) | 8 |
| 정렬된 데이터에서 찾기 | 이진 탐색 · DB 인덱스 | O(log n) | 5 |
| 조건이 복잡한 검색 | 선형 탐색 · 검색 엔진 | O(n) | 4 |
| 순서대로 나열 | sorted(key=…) | O(n log n) | 6·7 |
| 합계 · 평균 · 개수 | 한 번 훑기 · Counter | O(n) | 10 |
| 상위 N개만 | heapq.nlargest | O(n log k) | 10 |
| 명단 겹치기 · 빼기 | 집합 연산 | O(n+m) | 9 |
| 순서대로 처리 | deque | O(1) | 11 |
| 급한 것 먼저 처리 | heapq 우선순위 큐 | O(log n) | 11 |
| 빠른 근사 최적 | 탐욕 | O(n log n) | 12 |
| 정확한 최적 | 동적 계획법 | O(n·m) | 13 |
| N단계 이내 연결 찾기 | BFS | O(V+E) | 15 |
| 최소 비용 경로 | 다익스트라 | O(E log V) | 15 |
| 같은 계산 반복 줄이기 | LRU 캐시 | O(1) | 16 |
| 과부하 막기 | 토큰 버킷 | O(1) | 17 |
| 이상 징후 찾기 | 규칙 점수 · Z-점수 | O(n) | 18 |
정답은 상황에 따라 다릅니다. 그 '상황'을 판단하는 법이 이 강의의 결론이에요.
Python
브라우저에서 실행
서버를 키우는 것과 알고리즘을 고치는 것
| 서버 증설 | 알고리즘 개선 | |
|---|---|---|
| 효과 | 대개 2~4배 | 때로 1,000배 이상 |
| 비용 | 매달 계속 나감 | 한 번 고치면 끝 |
| 데이터가 10배 되면 | 또 증설해야 함 | O(log n)이면 거의 그대로 |
| 적합한 경우 | 이미 효율적인데 양이 많을 때 | 복잡도가 잘못 골라졌을 때 |
O(n²)를 서버로 해결하려는 것이 가장 흔하고 가장 비싼 실수입니다. 데이터가 10배가 되면 100배 느려지는데, 서버를 100대로 늘릴 수는 없으니까요.
🤔 확인 문제
전체 실행 시간의 5%를 차지하는 부분을 100배 빠르게 만들면 전체는?
해설 암달의 법칙입니다. 나머지 95%는 그대로니까요. 가장 큰 조각을 찾는 것이 최적화의 대부분이에요.
🤔 확인 문제
데이터가 10배 늘 때마다 서버를 증설하는 것으로 해결되지 않는 경우는?
해설 O(n²)는 복잡도 자체가 문제입니다. 서버를 100배로 늘릴 수는 없어요. 알고리즘을 O(n)이나 O(n log n)으로 바꾸는 것이 유일한 답입니다.
🤔 확인 문제
알고리즘을 고를 때 가장 먼저 생각해야 할 것은?
해설 데이터 크기와 연산 빈도가 전부입니다. 100개짜리 목록엔 선형 탐색이 정답이고, 한 번만 찾을 거면 정렬은 낭비예요. 완벽한 알고리즘은 없고, 이 상황에 맞는 알고리즘이 있을 뿐입니다.