✅ BFS란?
BFS (Breadth-First Search, 너비 우선 탐색)는
시작 정점에서 가까운 노드부터 차례대로 탐색하는 알고리즘
- DFS는 "한쪽 길을 끝까지 파고들기"
- BFS는 "지금 위치에서 가까운 곳부터 넓게 퍼져나가기"
✅ BFS 특징
| 사용 자료구조 | queue (FIFO) |
| 탐색 순서 | 가까운 곳부터 차례대로 |
| 주로 사용하는 상황 | 최단 거리 구할 때, 레벨 단위 탐색할 때 |
✅ BFS 기본 흐름 (2D 맵 기준)
- 시작 위치를 큐에 push
- 방문처리
- 큐에서 하나 꺼내기
- **상하좌우(혹은 8방향)**을 확인하며 조건에 맞는 이웃을 push
- 큐가 빌 때까지 반복
✅ BFS 예제 (2차원 배열 색칠 문제 기준)
void bfs(vector<vector<char>>& grid, int x, int y, int N, char color) {
int dx[] = {0, 0, -1, 1}; // x축 이동: 상하좌우
int dy[] = {-1, 1, 0, 0}; // y축 이동: 상하좌우
queue<pair<int, int>> q; // BFS에 사용할 큐
q.push({x, y}); // 시작점 추가
grid[y][x] = 0; // 시작점 방문처리
while (!q.empty()) {
auto [cx, cy] = q.front(); // 큐에서 현재 좌표 꺼냄
q.pop();
for (int i = 0; i < 4; ++i) { // 4방향 탐색
int nx = cx + dx[i]; // 다음 x
int ny = cy + dy[i]; // 다음 y
// 범위 내 && 같은 색이면
if (nx >= 0 && nx < N && ny >= 0 && ny < N && grid[ny][nx] == color) {
grid[ny][nx] = 0; // 방문처리
q.push({nx, ny}); // 큐에 추가
}
}
}
}
✅ 단계별 설명
1. dx[], dy[] 정의
int dx[] = {0, 0, -1, 1};
int dy[] = {-1, 1, 0, 0};
- dx, dy는 이동 방향 (각각 상, 하, 좌, 우 순서를 나타냄)
- 예를 들어 위로 가려면:
x + dx[0] = x + 0, y + dy[0] = y - 1 → (x, y-1) 즉 위쪽
2. 시작 좌표 x, y를 큐에 넣고 방문처리
queue<pair<int, int>> q;
q.push({x, y});
grid[y][x] = 0;
- 시작 위치는 방문 처리 (0으로 변경)
- 큐에 넣어서 BFS 탐색 시작
3. 큐가 빌 때까지 반복
while (!q.empty()) {
auto [cx, cy] = q.front(); // 현재 좌표
q.pop();
- cx, cy는 현재 탐색 중인 좌표
- front()로 꺼내고 pop()으로 큐에서 제거
4. 4방향으로 이웃 확인
for (int i = 0; i < 4; ++i) {
int nx = cx + dx[i];
int ny = cy + dy[i];
- 현재 위치에서 상하좌우 방향으로 한 칸씩 이동하며 이웃 확인
5. 방문 조건 확인
if (nx >= 0 && nx < N && ny >= 0 && ny < N && grid[ny][nx] == color) {
- 좌표가 범위 안에 있는지 확인
- 색깔이 처음과 같은지 확인
6. 방문 처리 + 큐에 추가
grid[ny][nx] = 0;
q.push({nx, ny});
- 방문했으니 0으로 마킹
- 다음 탐색을 위해 큐에 추가
✅ 시각적으로 보면
시작점 (2, 2)
→ 큐에 (2,2) 넣음
→ (2,2)의 상하좌우 체크
→ 같은 색인 (2,3), (1,2) 발견
→ 큐에 넣고 계속 반복
→ 이렇게 인접한 같은 색 모두 탐색 완료!
✅ BFS로 연결된 영역 찾기 핵심 포인트
| 큐 사용 | 현재 위치 기준, 이웃 순서대로 처리 |
| 방문처리 | 반드시 해야 무한루프 방지됨 |
| 좌표 범위 확인 | 0 <= x < N 꼭 확인해야 함 |
| 같은 값 비교 | grid[ny][nx] == color 로 탐색 |
✅ BFS vs DFS 차이 정리
| 구조 | Stack (재귀 or 수동 stack) | Queue (queue) |
| 탐색 순서 | 깊게 파고들기 | 가까운 곳부터 넓게 탐색 |
| 용도 | 모든 경로 탐색, 영역 세기 등 | 최단 거리 탐색, 거리/레벨 기반 문제 |
| 구현 난이도 | 간단 (재귀) | 비교적 쉬움 (queue만 쓰면 됨) |
'이론공부 > 혼자 공부' 카테고리의 다른 글
| 그리디(Greedy) 알고리즘 | 탐욕법 (0) | 2025.10.28 |
|---|---|
| 다익스트라 알고리즘 (0) | 2025.10.28 |
| 모듈러 연산(Modular Arithmetic) (0) | 2025.10.08 |
| DFS (Depth-First Search, 깊이 우선 탐색) (0) | 2025.06.26 |
| DP(Dynamic Programming) (1) | 2025.06.19 |