원리 · intermediate

그래프 탐색: BFS·DFS

큐와 스택(재귀)으로 연결 요소·최단 간선을 찾습니다.

배우기 · 알고리즘 원리 · 20분 · 9/14 · graph · bfs · dfs

이 트랙 목차 (14)
  1. 1. 시간·공간 복잡도 (Big-O) 제대로 읽기
  2. 2. 투포인터: 양끝·같은방향
  3. 3. 해시맵·해시셋: 빠른 조회
  4. 4. 스택·큐: LIFO와 FIFO
  5. 5. 재귀와 이분 탐색
  6. 6. 슬라이딩 윈도우
  7. 7. 동적 계획법 입문 (DP)
  8. 8. 누적합·차분 배열
  9. 9. 그래프 탐색: BFS·DFS
  10. 10. 정렬을 언제 쓰나: 전처리·이분·그리디
  11. 11. 그리디: 탐욕 선택과 반례
  12. 12. 행렬·격자: 인덱싱과 방문
  13. 13. 비트 연산 기초: AND OR XOR · 플래그
  14. 14. 우선순위 큐·힙 감각

그래프 표현

인접 리스트가 일반적입니다.

const g = Array.from({ length: n }, () => []);
g[u].append?.(v); // python
g[u].push(v);

격자(미로)는 4방향 이동으로 암묵적 그래프입니다.

DFS

깊이 우선. 재귀 또는 명시 스택.

깊은 재귀는 브라우저에서 위험 → 스택으로 바꾸기.

BFS

큐로 넓이 우선.

const q = [start];
const dist = Array(n).fill(-1);
dist[start] = 0;
while (q.length) {
  const u = q.shift();
  for (const v of g[u]) {
    if (dist[v] === -1) {
      dist[v] = dist[u] + 1;
      q.push(v);
    }
  }
}

shift는 O(n)이라 큰 n에서는 인덱스 큐가 낫습니다.

방문 배열

같은 노드를 두 번 넣지 않도록 visited / dist !== -1로 막습니다.
안 막으면 무한 루프·메모리 폭주.

격자 섬 세기

육지를 만나면 DFS/BFS로 연결된 육지를 전부 방문 처리 → 섬 +1.
이 사이트 island 태그 문제와 연결됩니다.

복잡도

정점 V, 간선 E일 때 BFS/DFS는 O(V+E).
격자 n×m이면 O(nm).

큐 구현 팁 (JS)

let head = 0;
const q = [start];
while (head < q.length) {
  const u = q[head++];
  ...
}

shift() 대신 인덱스를 올리면 큰 입력에서 낫습니다.

연습

섬의 개수·미로 도달 가능 여부 문제를 island/bfs 태그로 찾아 보세요.

관련 짧은 원리

관련 문제