탐색이란 선형 탐색 이진 탐색 왜 빠른가 실무·주의 📝 문제풀이
◀ 이전 📋 목차 CH 08 ▶
🔎 CHAPTER 07 · 알고리즘

원하는 값, 어떻게 찾을까?

데이터 더미에서 값을 찾는 탐색(search)은 코테의 기본기예요. 하나씩 훑는 선형 탐색과, 정렬된 배열을 절반씩 줄이는 이진 탐색의 차이를 확실히 잡아봐요.

🎯 이 장을 끝내면
📖
탐색이란
데이터 안에서 원하는 값 찾기
한 문장으로 먼저 잡아볼게요.
🔎 탐색(Search) = 원하는 값이 어디 있나 찾기 탐색은 여러 데이터 중에서 특정 값이 있는지, 있다면 어디에 있는지를 찾아내는 일이에요. 배열에서 42라는 값을 찾거나, 그 값의 인덱스를 알아내는 상황이죠. 💡 도서관에서 책 한 권을 찾는다고 생각해봐요. 책장을 처음부터 하나씩 보는 방법(선형)과, 정렬된 목록에서 중간을 펼쳐 좁혀가는 방법(이진)이 있어요.
🔤
인덱스(index) — 배열에서 각 값이 놓인 "자리 번호"예요. 맨 앞이 0번, 그다음이 1번… 이렇게 매겨요. 그래서 "값을 찾는다"는 건 사실 "그 값이 몇 번 자리에 있는지 찾는다"는 뜻이기도 해요.
선형 탐색 이진 탐색 O(n) O(log n) 정렬 코딩테스트
🔤
Big-O 표기법(Big-O notation) — 데이터(n)가 늘어날 때 알고리즘이 대략 얼마나 느려지는지를 나타내는 표기법이에요. O(n)은 "n에 비례해서 늘어난다", O(log n)은 "n이 아무리 커져도 아주 천천히 늘어난다"는 뜻이에요. 정확한 초 단위 속도가 아니라 "몇 배로 느려지는가"라는 경향을 보는 지표라고 생각하면 쉬워요.
🧭
이 장의 핵심 대비. 정렬 여부에 상관없이 쓸 수 있지만 느린 선형 탐색과, 정렬이 전제지만 훨씬 빠른 이진 탐색. 둘의 속도 차이와 전제조건을 구분하는 게 이번 장의 전부라고 해도 돼요.
🚶
선형 탐색
처음부터 하나씩 비교하기
가장 단순하고, 어디서나 통하는 방법이에요.

선형(순차) 탐색은 배열의 맨 앞부터 끝까지 하나씩 값을 비교하며 찾는 값을 만날 때까지 훑는 방법이에요. 정렬이 돼 있지 않아도 그대로 쓸 수 있는 게 장점이에요.

🚶 하나씩 순회하며 비교
function linearSearch(arr, target) {
  for (let i = 0; i < arr.length; i++) {  // 앞에서부터 하나씩
    if (arr[i] === target) {
      return i;      // 찾으면 그 위치(인덱스) 반환
    }
  }
  return -1;         // 끝까지 없으면 -1
}

linearSearch([7, 2, 9, 4], 9);  // → 2
찾는 값이 맨 끝에 있거나 아예 없으면 배열 전체를 다 훑어야 해요. 그래서 최악의 경우 비교 횟수는 n번 → O(n). 💡 정렬 여부와 무관하게 항상 동작하지만, n이 크면 느려요. "정렬 안 된 데이터에서 한 번만 찾을 때"엔 오히려 이게 정답이에요.
💡
최선 vs 최악. 운 좋게 맨 앞에서 바로 찾으면 O(1)이지만, Big-O는 최악의 경우를 기준으로 하므로 선형 탐색은 O(n)으로 봐요.
✂️
이진 탐색
정렬된 배열을 절반씩 줄이며 찾기
binary search — 전제는 "반드시 정렬돼 있어야 함".

이진 탐색(binary search)정렬된 배열에서 가운데 값과 찾는 값을 비교해, 한쪽 절반을 통째로 버리며 범위를 절반씩 줄여 찾는 방법이에요 → O(log n). 전제는 딱 하나, 배열이 반드시 정렬돼 있어야 함이에요.

✂️ 동작 원리 — low · high · mid 1. 범위의 양 끝 low(왼쪽), high(오른쪽)를 잡아요.
2. 가운데 mid를 구해 arr[mid]target을 비교해요.
3. target이 더 크면 왼쪽 절반을 버리고(low = mid + 1), 더 작으면 오른쪽 절반을 버려요(high = mid - 1).
4. 같으면 찾은 거예요. 범위가 빌 때까지 반복해요.
✂️ 코드로 보기
function binarySearch(arr, target) {  // arr은 오름차순 정렬 가정
  let low = 0, high = arr.length - 1;
  while (low <= high) {
    let mid = Math.floor((low + high) / 2);  // 가운데 인덱스
    if (arr[mid] === target) {
      return mid;                 // 찾음
    } else if (arr[mid] < target) {
      low = mid + 1;              // 오른쪽 절반만 남김
    } else {
      high = mid - 1;             // 왼쪽 절반만 남김
    }
  }
  return -1;                      // 없음
}

binarySearch([1, 3, 5, 7, 9, 11], 9);  // → 4
💡 한 번 비교할 때마다 후보가 절반으로 줄어요. 그래서 아무리 커도 몇 번이면 끝나요.
⚠️
전제조건을 잊지 마세요. 이진 탐색은 정렬된 배열에서만 올바르게 동작해요. 정렬 안 된 배열에 쓰면 절반을 버리는 판단 자체가 틀려서 엉뚱한 결과가 나와요.
🖼️ 그림으로 보기 — 이진 탐색 = 절반씩 줄이기
lo mid hi 1 3 5 7 9 11 13 15
정렬된 배열에서 중간값과 비교해 매번 후보를 절반으로 줄여요 → O(log n). (정렬 안 됐으면 못 씀)
🚀
왜 빠른가
100만 개에서 선형은 100만, 이진은 약 20번
절반씩 줄이는 힘을 숫자로 느껴봐요.

데이터가 n = 1,000,000개일 때, 선형 탐색은 최악의 경우 100만 번 비교해요. 이진 탐색은 매번 절반으로 줄어드니 2²⁰ ≈ 100만, 즉 약 20번이면 끝나요.

데이터 개수 n선형 탐색 (최악)이진 탐색 (최악)
1,000약 1,000번약 10번
1,000,000약 100만 번약 20번
10억약 10억 번약 30번
복잡도O(n)O(log n)
💡
로그의 힘: n이 100만 배 커져도 이진 탐색의 비교 횟수는 고작 몇 배만 늘어요. 이게 O(log n)이 코테에서 사랑받는 이유예요.
🧰
실무·주의
"한 번 정렬, 여러 번 탐색"일 때 이진이 유리
정렬 비용을 함께 따져야 진짜 이득이 보여요.

이진 탐색이 항상 정답은 아니에요. 정렬돼 있지 않은 데이터라면 먼저 정렬(O(n log n))해야 하는데, 딱 한 번만 찾을 거라면 그냥 선형 탐색(O(n))이 더 빠를 수 있어요.

🧰 언제 무엇을 쓰나 선형 탐색 — 데이터가 정렬돼 있지 않고, 탐색을 몇 번 안 할 때. 단순하고 전제조건이 없어요.
이진 탐색 — 데이터가 이미 정렬돼 있거나, 한 번 정렬해두고 여러 번 탐색할 때. 정렬 비용을 여러 탐색이 나눠 부담하니 압도적으로 유리해요. 💡 "정렬 비용은 한 번, 빠른 탐색은 여러 번" — 이 구조일수록 이진 탐색의 이득이 커져요.

참고로 "탐색"에는 배열에서 값을 찾는 것 말고, 그래프나 트리처럼 연결된 구조를 훑는 탐색도 있어요. 뒤 챕터에서 자세히 배우지만, 아래 두 용어는 문제풀이에도 나오니 미리 감만 잡아둬요.

🔤
BFS(너비 우선 탐색) — 시작점에서 가까운 곳부터 넓게 퍼져나가며 훑는 방법이에요. 물에 돌을 던지면 물결이 동심원으로 퍼지듯, 한 칸 거리를 다 본 뒤 두 칸 거리를 보는 식이죠. 먼저 발견한 순서대로 처리하려고 큐(FIFO)를 써요. 가까운 길(최단 경로)을 찾을 때 유리해요.
🔤
DFS(깊이 우선 탐색) — 갈 수 있는 데까지 쭉 파고들었다가, 막히면 되돌아 나와 다른 길로 가는 방법이에요. 미로에서 한 방향으로 끝까지 가보고 막다른 길이면 돌아 나오는 것과 같아요. 마지막에 간 곳부터 되돌아오니 스택(LIFO)이나 재귀가 자연스러워요.
🔤
방문 표시(visited) — 그래프를 탐색할 때 이미 다녀간 곳을 따로 적어두는 것이에요. 길이 빙 돌아 제자리로 오는(사이클) 구조에서는, 이 표시가 없으면 같은 곳을 계속 오가며 무한 반복에 빠져요. 그래서 BFS·DFS 둘 다 방문한 곳을 표시해 다시 안 가게 막아요.
🧪
이 과목의 실습 랩에서 선형·이진 탐색을 직접 짜고 실행·채점해볼 수 있어요. 상단 🧪 실습 버튼에서 열려요. mid 계산과 범위 좁히기를 손으로 짜보면 훨씬 오래 남아요.
🧠 이 장 핵심 요약
📝
문제풀이 · 점검
배운 걸 가볍게 점검해봐요
시험이 아니라 "내가 이해했나" 확인용이에요. 틀려도 바로 해설이 나와요.
🧪
문제를 풀면 즉시 정답과 해설이 나오고, 위쪽 바에 점수가 쌓여요. 손으로 직접 짜보고 싶으면 상단 🧪 실습 랩으로!
CH 08 🌀 재귀 — 자기 자신을 부르는 함수, 그리고 이진 탐색의 재귀 버전