접근 큰그림 완전 탐색 투 포인터 슬라이딩 윈도우 그리디 📝 문제풀이
◀ 이전 🎉 완주 · 목차
🏁 CHAPTER 10 · 심화

이제 도구를 골라 쓰는 안목이 필요해요

배운 자료구조들을 실전 문제에 어떻게 꺼내 쓸지가 마지막 관문이에요. 이번 장은 코테에서 반복적으로 등장하는 네 가지 핵심 기법문제를 읽는 눈을 정리합니다.

🎯 이 장을 끝내면
🗺️
접근 큰그림
문제를 읽고 "허용 복잡도"부터 가늠해요
코드를 짜기 전에, 입력 크기가 답을 알려줘요.

코테 문제는 대부분 입력 크기 n의 범위를 알려줘요. 이 숫자를 보면 어떤 복잡도까지 통과되는지를 거꾸로 추론할 수 있어요. 보통 1초에 약 1억 번 연산이 기준이에요.

🔤
코딩테스트(코테, Coding Test) — 회사가 지원자의 실력을 확인하려고, 정해진 시간 안에 문제를 읽고 프로그램을 짜서 제출하게 하는 시험이에요. 줄여서 "코테"라고 불러요.
🔢 n을 보고 복잡도를 가늠하기 n ≤ 20 정도 → 지수·완전 탐색도 가능 (O(2ⁿ))
n ≤ 1,000 → 이중 반복 O(n²)도 무난
n ≤ 100,000O(n log n)까지 (정렬·투 포인터)
n ≥ 1,000,000O(n)이나 O(log n)만 안전 → O(n²)시간 초과 💡 순서가 반대예요. "어떤 알고리즘을 쓸까"를 먼저 고민하지 말고, n을 보고 허용 복잡도를 정한 뒤 거기에 맞는 자료구조·기법을 고르는 게 실전 접근이에요.
🔤
시간 초과(Time Limit Exceeded, TLE) — 정답 자체는 맞게 짰지만, 컴퓨터가 계산하는 데 너무 오래 걸려서 정해진 시간 안에 답을 내지 못한 경우예요. "정답은 맞혔지만 제한 시간을 넘겨서 실격"된 상황이라고 생각하면 돼요.
완전 탐색 투 포인터 슬라이딩 윈도우 그리디 입력 크기 허용 복잡도 코딩테스트
🖼️ 그림으로 보기 — 이 장의 네 가지 무기
🔎
완전 탐색
모든 경우를 다 확인. 확실하지만 작은 n에 적합.
↔️
투 포인터
정렬 배열에서 양 끝을 좁혀 O(n).
🪟
슬라이딩 윈도우
연속 구간을 옮기며 부분합·최댓값 O(n).
💰
그리디
매 순간 지금 최선. 빠르지만 항상 최적은 아님.
🧭
기법은 자료구조 위에서 돌아가요. 지금까지 배운 배열·해시·스택·큐·트리가 재료라면, 이번 장의 네 기법은 그 재료를 어떻게 조합해 쓸지에 대한 조리법이에요.
🔎
완전 탐색
브루트포스 — 모든 경우를 다 확인해요
확실하지만 느릴 수 있어요. 작은 n에 적합해요.

완전 탐색(브루트포스, brute force)가능한 모든 경우를 하나도 빠짐없이 확인하는 방법이에요. 아이디어가 필요 없어 가장 먼저 떠올릴 수 있고, 정답을 놓칠 일이 없어요. 대신 경우의 수가 많으면 느려요.

🐢 예 — 배열에서 두 수의 합이 target인 쌍 찾기 (완전 탐색)
function hasPairBrute(arr, target) {
  for (let i = 0; i < arr.length; i++) {
    for (let j = i + 1; j < arr.length; j++) {   // 모든 쌍을 확인
      if (arr[i] + arr[j] === target) return true;
    }
  }
  return false;
}
모든 쌍(n × n)을 다 보므로 O(n²). n이 작으면(수백~수천) 충분히 빠르고, 구현이 단순해 실수도 적어요. 💡 먼저 완전 탐색으로 맞추고, 시간 초과가 나면 개선하는 게 안전한 전략이에요. 작은 n에서는 굳이 복잡한 기법을 쓸 필요가 없어요.
↔️
투 포인터
양 끝에서 좁혀오며 O(n)에 해결해요
정렬된 배열에서 특히 강력해요.

투 포인터(two pointers)양 끝(또는 두 지점)의 포인터를 조건에 따라 안쪽으로 좁혀가며 답을 찾는 기법이에요. 정렬된 배열에서 두 수의 합 같은 문제를 O(n²)에서 O(n)으로 줄여줘요.

🐇 예 — 정렬된 배열에서 두 수의 합이 target인 쌍 (투 포인터)
function hasPairSorted(arr, target) {   // arr는 오름차순 정렬됨
  let lo = 0, hi = arr.length - 1;
  while (lo < hi) {
    const sum = arr[lo] + arr[hi];
    if (sum === target) return true;
    if (sum < target) lo++;   // 합이 작으면 왼쪽을 키운다
    else hi--;                 // 합이 크면 오른쪽을 줄인다
  }
  return false;
}
두 포인터가 서로를 향해 한 칸씩만 움직이니 전체 이동은 n번, 즉 O(n)이에요. 💡 핵심은 "합이 작으면 왼쪽↑, 크면 오른쪽↓"라는 방향성이에요. 정렬 덕분에 이 규칙이 성립하고, 그래서 모든 쌍을 다 볼 필요가 없어요.
🪟
슬라이딩 윈도우
연속된 구간을 미끄러뜨리며 계산해요
부분합·최댓값을 O(n)에 구하는 단골 기법이에요.

슬라이딩 윈도우(sliding window)연속된 구간(창, window)을 한 칸씩 이동시키며, 빠진 값은 빼고 새 값만 더하는 방식으로 매번 다시 계산하지 않아요. 그래서 O(n)에 구간 합·최댓값 등을 구할 수 있어요.

🪟 예 — 길이 k인 연속 구간의 최대 합 (슬라이딩 윈도우)
function maxWindowSum(arr, k) {
  let sum = 0;
  for (let i = 0; i < k; i++) sum += arr[i];   // 첫 창의 합
  let best = sum;
  for (let i = k; i < arr.length; i++) {
    sum += arr[i] - arr[i - k];   // 새 값 더하고, 빠진 값 뺀다
    best = Math.max(best, sum);
  }
  return best;
}
매 칸마다 덧셈·뺄셈 한 번씩이므로 전체 O(n). 창을 옮길 때마다 k개를 다시 더하면 O(n·k)가 되니, 차이만 갱신하는 게 핵심이에요. 💡 "연속된 구간" "부분 배열" "길이 k 구간" 같은 표현이 보이면 슬라이딩 윈도우를 떠올려요.
💰
그리디
매 순간 지금 최선을 골라요
빠르지만, 항상 최적은 아니에요.

그리디(greedy, 탐욕법)매 순간 지금 가장 좋아 보이는 선택을 하고, 뒤를 되돌아보지 않는 방법이에요. 구현이 단순하고 빠르지만, 지역적 최선이 전체 최선을 보장하지 않을 수 있어요.

💰 예 — 동전 거스름돈, 큰 단위부터 (그리디)
function coinCount(coins, amount) {   // coins: 내림차순 정렬
  let count = 0;
  for (const c of coins) {
    count += Math.floor(amount / c);   // 가능한 만큼 큰 동전부터
    amount %= c;
  }
  return count;   // 사용한 동전 개수
}
500 → 100 → 50 → 10원처럼 큰 단위부터 최대한 쓰면 개수가 최소가 돼요. ⚠️ 단, 그리디가 최적을 보장하려면 조건이 필요해요. 동전이 1·3·4원처럼 배수 관계가 아니면 큰 것부터 고르는 게 최적이 아닐 수 있어요. "이 문제에서 그리디가 통하는가"를 먼저 따져야 해요.
🔤
DP(동적 계획법, Dynamic Programming) — 문제풀이에도 나오는 또 하나의 무기예요. 큰 문제를 작은 문제로 쪼갠 뒤, 한 번 구한 작은 답을 저장해두고 재활용하는 방법이에요(8장의 메모이제이션이 그 예). 그리디가 "매 순간 최선"으로 가볍게 고른다면, DP는 겹치는 작은 문제들의 답을 차곡차곡 쌓아 확실한 최적을 구해요. "같은 계산이 자꾸 반복되네?" 싶을 때 떠올리면 좋아요.
상황(원하는 것)고르면 좋은 자료구조이유
빠른 조회·존재 확인해시(Map/Set)키로 O(1) 접근
순서대로 저장·인덱스 접근배열인덱스 접근 O(1)
LIFO(마지막이 먼저)스택되돌리기·괄호 검사 등
FIFO(먼저 온 게 먼저)대기열·BFS 등
정렬 상태 유지·범위 탐색트리(BST 등)탐색·삽입 O(log n)
🧪
이 과목의 실습 랩에서 방금 배운 기법으로 직접 함수를 짜고 실행·채점해볼 수 있어요. 상단 🧪 실습 버튼에서 열려요. 손으로 짜봐야 실전에서 떠올라요.
🧠 이 장 핵심 요약
📝
문제풀이 · 점검
배운 걸 가볍게 점검해봐요
시험이 아니라 "내가 이해했나" 확인용이에요. 틀려도 바로 해설이 나와요.
🧪
문제를 풀면 즉시 정답과 해설이 나오고, 위쪽 바에 점수가 쌓여요. 손으로 직접 짜보고 싶으면 상단 🧪 실습 랩으로!
🎉 완주를 축하해요!
🎉 완주 🗺️ 전체 로드맵으로 — 지금까지의 여정을 한눈에 돌아보고, 복습할 챕터를 골라봐요