4강 / 20강
선형 탐색 — 창고를 처음부터 뒤지기
가장 단순하고, 가장 정직하고, 가장 자주 문제가 되는 알고리즘
주문 번호 ORD-20260819-0042 의 배송지를 확인해야 합니다.
주문 목록은 그냥 들어온 순서대로 쌓여 있습니다.
방법은 하나뿐입니다. 맨 앞에서부터 하나씩 보면서 번호가 맞는지 확인한다. 이것을 선형 탐색(linear search) 또는 순차 탐색이라고 부릅니다.
너무 당연해서 알고리즘 같지도 않죠? 그런데 이것이 여러분 쇼핑몰이 느려지는 원인 1위입니다.
찾는 것이 뒤에 있을수록, 없을수록 오래 걸립니다.
Python
브라우저에서 실행
🎮 창고 순차 탐색
아래에서 상품을 골라 찾아 보세요. 로봇이 선반을 한 칸씩 지나갑니다. 개수를 늘렸을 때 걸음 수가 어떻게 변하는지, 그리고 없는 상품을 찾으면 무슨 일이 벌어지는지 꼭 해 보세요.
그래도 선형 탐색을 써야 할 때
느리다고 나쁜 알고리즘은 아닙니다. 이럴 때는 선형 탐색이 정답이에요.
- 데이터가 적을 때 — 100개짜리 목록에 인덱스를 만드는 게 더 손해입니다.
- 정렬이 안 되어 있고, 한 번만 찾을 때 — 정렬하는 데 O(n log n)이 드는데 한 번 찾자고 정렬하면 손해예요.
- 조건이 복잡할 때 — "이름에 '무선'이 들어가고 재고가 3개 이상인 것"은 인덱스로 못 찾습니다. 결국 다 훑어야 해요.
복잡한 조건 검색은 결국 전부 훑는 O(n)입니다.
Python
브라우저에서 실행
조금이라도 빠르게 — 실무의 잔기술
알고리즘 자체는 그대로 O(n)이지만, 실제 체감 속도를 줄이는 방법들이 있습니다.
- 찾으면 즉시 멈추기 —
break또는return. 끝까지 도는 코드는 평균 2배 느립니다. - 자주 찾는 것을 앞으로 — 인기 상품을 목록 앞에 두면 평균 걸음이 확 줄어듭니다. (16강 캐시의 기본 아이디어예요.)
- 싼 조건을 먼저 검사 —
재고 >= 3(빠름)을"무선" in 이름(느림)보다 먼저 쓰면 대부분 일찍 걸러집니다.
같은 알고리즘, 한 줄 차이로 990배.
Python
브라우저에서 실행
🤔 확인 문제
상품 10,000개에서 없는 상품을 선형 탐색으로 찾으면 몇 번 비교할까요?
해설 없다는 것을 확신하려면 전부 다 봐야 합니다. 그래서 검색 결과가 없을 때가 가장 느립니다. 오타를 친 손님이 서버를 가장 괴롭히는 이유예요.
🤔 확인 문제
주문 5,000건 각각에 대해 상품 20,000개를 선형 탐색하는 코드의 최악 비교 횟수는?
해설 5,000 × 20,000 = 1억 번. 이것이 N+1 문제입니다. 상품을 딕셔너리에 한 번만 담아 두면(8강) 5,000번으로 줄어요.
🤔 확인 문제
다음 중 선형 탐색을 쓰는 것이 합리적인 상황은?
해설 40개짜리 목록은 인덱스를 만드는 비용이 더 큽니다. 데이터가 작으면 단순한 것이 정답이에요. 나머지는 모두 해시나 인덱스가 필요합니다.