BFS 알고리즘은 너비 우선 탐색 방법으로, 가까운 노드부터 우선적으로 탐색하는 알고리즘이다.
주로 Queue 자료구조를 이용하여 모든 노드를 탐색한다.
예시를 살펴보자
예시 그래프~~!! 방문 기준은 번호가 낮은 인접 노드부터, 시작 노드는 1이라고 하자.
큐에 1 넣음
큐에 있던 1을 꺼내주고 인접 노드 2 3 8 을 넣어준다.
2 3 8 에서 2를 꺼내주고 2와 인접한 노드 7을 넣어준다.
큐 : 3 8 7
3 8 7 에서 3을 빼주고 3과 인접한 노드 4, 5를 넣어준다.
큐 : 8 7 4 5
8 7 4 5에서 8을 빼주고 8과 인접한 노드는 모두 방문했으므로 추가x
큐 : 7 4 5
7 4 5에서 7을 빼고 인접 노드 6을 들르면 모든 노드를 탐색하게 된다.
따라서 노드를 탐색하는 순서는 1 - 2 - 3 - 8 - 7 - 4 - 5 - 6 이 된다.
이를 코드로 나타내면
import java.util.*;
public class BFS {
public static boolean[] visited = new boolean[9];
public static ArrayList<ArrayList<Integer>> graph = new ArrayList<ArrayList<Integer>>();
// BFS 함수 정의
public static void bfs(int start) {
Queue<Integer> q = new LinkedList<>();
q.offer(start);
// 현재 노드를 방문 처리
visited[start] = true;
// 큐가 빌 때까지 반복
while(!q.isEmpty()) {
// 큐에서 하나의 원소를 뽑아 출력
int x = q.poll();
System.out.print(x + " ");
// 해당 원소와 연결된, 아직 방문하지 않은 원소들을 큐에 삽입
for(int i = 0; i < graph.get(x).size(); i++) {
int y = graph.get(x).get(i);
if(!visited[y]) {
q.offer(y);
visited[y] = true;
}
}
}
}
public static void main(String[] args) {
// 그래프 초기화
for (int i = 0; i < 9; i++) {
graph.add(new ArrayList<Integer>());
}
// 노드 1에 연결된 노드 정보 저장
graph.get(1).add(2);
graph.get(1).add(3);
graph.get(1).add(8);
// 노드 2에 연결된 노드 정보 저장
graph.get(2).add(1);
graph.get(2).add(7);
// 노드 3에 연결된 노드 정보 저장
graph.get(3).add(1);
graph.get(3).add(4);
graph.get(3).add(5);
// 노드 4에 연결된 노드 정보 저장
graph.get(4).add(3);
graph.get(4).add(5);
// 노드 5에 연결된 노드 정보 저장
graph.get(5).add(3);
graph.get(5).add(4);
// 노드 6에 연결된 노드 정보 저장
graph.get(6).add(7);
// 노드 7에 연결된 노드 정보 저장
graph.get(7).add(2);
graph.get(7).add(6);
graph.get(7).add(8);
// 노드 8에 연결된 노드 정보 저장
graph.get(8).add(1);
graph.get(8).add(7);
bfs(1);
}
}
가 된다. 큐 값이 빌 때까지 반복해준다.
출처 : 이것이 취업을 위한 코딩 테스트다 (https://www.youtube.com/watch?v=7C9RgOcvkvo&list=PLRx0vPvlEmdAghTr5mXQxGpHjWqSz0dgC&index=3)
'알고리즘 > 자료구조와 알고리즘' 카테고리의 다른 글
[Algorithm] DP(Dynamic Programming) 다이나믹 프로그래밍 알고리즘 (0) | 2022.02.21 |
---|---|
[Algorithm] 순열(permutation) for JAVA (0) | 2022.02.17 |
[Algorithm] DFS 알고리즘 (깊이 우선 탐색) (0) | 2022.01.20 |
[Algorithm] 유클리드 호제법(유클리드 알고리즘) _ 재귀 함수 (0) | 2022.01.19 |
[Algorithm] 중복된 문자 제거하기 for JAVA (0) | 2021.11.05 |