"가장 단순한 탐색은 찾을 때까지 전부 보는 거야. 영리하지 않고, 그게 정확히 핵심이야 — 가끔 안 영리한 O(n) 훑기가 진짜 맞는 답이고, 그걸 과잉 설계하는 게 실수야."
숨길 게 없는 알고리즘
선형 탐색은 컬렉션을 한 번에 원소 하나씩 걸으며 target 을 찾으면 (또는 끝에 닿으면) 멈춰. 최악 O(n), 최선 O(1) (target 이 첫째), 그리고 거대한 미덕 하나: 정렬됐든 안 됐든 어떤 컬렉션에든, 셋업 제로로 작동해. 데이터가 정렬 안 됐고 색인이 없으면, 선형 탐색은 대비책이 아니라 — 유일한 옵션이고, 정직한 거야.
과잉 설계 함정
이 lesson 이 진짜 다루는 판단이야. 이진 탐색이랑 해시맵을 배운 뒤, 반사적으로 손대고 싶어져. 근데 생각해봐: 정렬 안 된 데이터를 이진 탐색하려면 먼저 정렬해야 해 — 그게 O(n log n), 단일 O(n) 훑기보다 더 비싸. 정렬 안 된 데이터의 한 번 탐색엔, 선형 탐색이 완승이야. 화려한 구조는 셋업 비용이 많은 탐색에 분할 상환될 때만 값해. 한 번 쿼리할 데이터에 이진 탐색 손대기가 전형적 조기 최적화야 — 단일 n 을 아끼려 n log n 을 치른 거.
Pythonic 형태들
루프를 손으로 쓸 일은 드물어 — Python 이 선형 탐색을 표현력 있는 형태로 줘: x in items (있어?), items.index(x) (어디?), any(pred(x) for x in items) (조건 맞는 거 있어?), next((x for x in items if pred(x)), default) (첫 매치, 또는 기본값). 전부 밑에선 O(n) 훑기야. 그게 선형인 걸 아는 게 반복문 안에 부주의하게 넣어 실수 O(n²) 만드는 걸 — Complexity 트랙의 함정 — 막아.