3강 / 20강

알고리즘의 비용 — 주문 100건과 100만 건은 다르다

잘 돌아가던 코드가 세일 날 서버를 멈추는 이유

알고리즘의 비용 — 주문 100건과 100만 건은 다르다
n이 커질 때 시간이 어떤 모양으로 늘어나는가 — 이것이 알고리즘의 진짜 성적표입니다.

개발자가 만든 상품 검색 기능이 있습니다. 테스트할 때는 0.01초. 완벽합니다. 그런데 오픈 6개월 뒤, 상품이 3만 개가 되자 5초가 걸립니다. 서버를 두 배 좋은 걸로 바꿨더니 2.5초. 여전히 느립니다.

무엇이 잘못된 걸까요? 서버가 부족한 게 아닙니다. 알고리즘이 잘못 골라진 것입니다.

비용을 재는 자 — 걸음 수

알고리즘의 비용은 초(second)로 재지 않습니다. 초는 컴퓨터 성능·네트워크·그날 서버 상태에 따라 매번 다르니까요.

대신 "데이터가 n개일 때 몇 걸음을 걷는가"를 셉니다. 이 걸음 수를 n에 대한 식으로 쓴 것이 시간 복잡도예요.

같은 1,000개 데이터인데 걸음 수가 1 vs 1,000 vs 500,000.
Python 브라우저에서 실행

O(빅오) 표기법 — 큰 그림만 남기기

걸음 수가 3n + 7 이든 5n + 100 이든, n이 100만이 되면 +7이나 +100은 아무 의미가 없습니다. 그래서 자잘한 것은 다 버리고 가장 크게 자라는 항만 남깁니다. 이 표기법이 O( ), "빅오"예요.

표기이름쇼핑몰에서의 예n=100만일 때
O(1)상수주문번호로 딱 하나 조회 (해시)1번
O(log n)로그정렬된 목록에서 이진 탐색20번
O(n)선형전체 매출 합산100만 번
O(n log n)선형로그상품 목록 정렬2,000만 번
O(n²)제곱모든 상품 쌍을 비교1조 번 💀

맨 아래를 보세요. 1조 번입니다. 1초에 1억 번을 계산하는 컴퓨터라도 약 3시간이 걸립니다. 이래서 O(n²)은 실무에서 "터진다"고 말해요.

🎮 성장 곡선 실험실

말로만 들으면 감이 안 옵니다. 직접 재 봅시다. 아래 위젯은 여러분의 브라우저에서 실제로 코드를 돌려 시간을 측정합니다. n을 2배씩 키우면서 시간이 몇 배로 늘어나는지 확인해 보세요.

성장 곡선 실험실 — n을 2배씩 키우며 실제 시간을 측정합니다
불러오는 중…

최선 · 최악 · 평균

같은 알고리즘도 운에 따라 다릅니다. 창고 100칸을 앞에서부터 뒤지는 알고리즘을 생각해 보세요.

  • 최선 — 찾는 물건이 1번 칸에 있음 → 1걸음
  • 최악 — 마지막 칸에 있거나, 아예 없음 → 100걸음
  • 평균 — 대체로 절반쯤 → 50걸음

실무에서 기준으로 삼는 것은 거의 항상 최악입니다. "평균 0.1초"인 서비스라도 최악이 30초면 그 손님은 떠나니까요.

직접 측정해 보세요. n이 2배면 시간은 4배 — 그것이 O(n²)의 정체입니다.
Python 브라우저에서 실행
🤔 확인 문제
상품 1,000개에서 0.5초 걸리던 O(n²) 알고리즘이 있습니다. 상품이 10,000개가 되면 대략 얼마나 걸릴까요?
🤔 확인 문제
다음 중 데이터가 100만 개일 때 가장 빠른 것은?
🤔 확인 문제
시스템 관리자가 성능을 판단할 때 보통 기준으로 삼는 것은?