Information Security Study
BFS 개념 본문
BFS
: 너비 우선 탐색
- 가까운 노드부터 우선적으로 탐색하는 알고리즘
- 보통 그래프 탐색에 사용
- 두 노드 사이의 최단 경로 또는 임의의 경로를 찾을 때 사용
- Queue로 구현
BFS의 특징
- BFS는 시작 정점으로부터 거리가 가까운 정점의 순서로 탐색한다.
- 거리 1부터 2, 3 순서대로
- 그래프 탐색의 경우 어떤 노드를 방문했었는지 여부를 반드시 검사해야 한다.
- 이를 검사하지 않을 경우 무한루프에 빠질 위험이 있다.
- BFS는 재귀적으로 동작하지 않는다.
- BFS는 방문한 노드들을 차례로 저장한 후 꺼낼 수 있는 자료 구조인 큐(Queue)를 사용한다.
- 선입선출(FIFO) 원칙으로 탐색
- 일반적으로 큐를 이용해서 반복적 형태로 구현하는 것이 가장 잘 동작한다.
시작 노드: 1
BFS 탐색 과정
1. 큐에 1번 노드를 넣고 방문 했음을 표시한다.
2. 1번과 인접한 노드들 2, 3, 7을 큐에 넣고 방문 처리한다.
3. 큐에서 노드 하나를 꺼낸다. 큐는 FIFO기 때문에 1번 노드를 꺼낸다.
4. 인접한 노드가 없다면 3. 과정으로 돌아간다.
5. 인접한 노드가 있고 방문하지 않았다면 큐에 넣고 방문 처리 후 3. 과정으로 돌아간다.
6. 큐가 빌 때까지 반복한다.
BFS 탐색 순서
1 -> 2 -> 3 -> 7 -> 5 -> 6 -> 4 -> 8
BFS 구현
import java.util.LinkedList;
import java.util.Queue;
public class Main {
public static void main(String[] args) {
// 그래프를 2차원 배열로 표현한다.
// 배열의 인덱스를 노드와 매칭시켜서 사용하기 위해 인덱스 0은 아무것도 저장하지 않는다.
// 1번 인덱스는 = 1번노드 / 노드의 배열의 값은 연결된 노드다.
int[][] graph = {{}, {2,3,8}, {1,6,8}, {1,5}, {5,7}, {3,4,7}, {2}, {4,5}, {1,2}};
// 방문처리를 위한 boolean 배열 선언
boolean[] visited = new boolean[9];
System.out.println(bfs(1, graph, visited));
//출력 내용 : 1 -> 2 -> 3 -> 8 -> 6 -> 5 -> 4 -> 7 ->
}
static String bfs(int start, int[][] graph, boolean[] visited) {
// 탐색 순서를 출력하기 위한 용도
StringBuilder sb = new StringBuilder();
// BFS에 사용할 큐 생성
Queue<Integer> q = new LinkedList<Integer>();
// 큐에 BFS를 시작 할 노드 번호 offer()
q.offer(start);
// 시작노드 방문처리
visited[start] = true;
// 큐가 빌 때까지 반복
while(!q.isEmpty()) {
int nodeIndex = q.poll();
sb.append(nodeIndex + " -> ");
// 큐에서 꺼낸 노드와 연결된 노드들 체크
for(int i=0; i<graph[nodeIndex].length; i++) {
int temp = graph[nodeIndex][i];
// 방문하지 않았으면 방문처리 후 큐에 넣기
if(!visited[temp]) {
visited[temp] = true;
q.offer(temp);
}
}
}
// 탐색순서 리턴
return sb.toString() ;
}
}
참고
[Java] BFS - 너비 우선 탐색 구현 (자바 | Java)
BFS는 너비 우선 탐색이라고도 부르며, 코딩테스트에서 빈번하게 나오는 알고리즘이다.가까운 노드 부터 우선적으로 탐색하며, 기본적으로 그래프 탐색에 사용된다.두 노드 사이의 최단 경로 혹
velog.io
https://codingnojam.tistory.com/41
[Algorithm] BFS(Breadth-first search)를 Java로 구현해보자!
안녕하세요 코딩노잼입니다. 오늘은 BFS(너비 우선 탐색)을 Java로 구현해보겠습니다. 1. BFS (Breadth-first Search) BFS는 너비 우선 탐색이라고 부르기도 하며, 코딩 테스트에서 자주 등장하는 알고리즘
codingnojam.tistory.com
https://minhamina.tistory.com/36
[Java] BFS 너비 우선 탐색 - 인접리스트 / 인접행렬로 구현
BFS 너비 우선 탐색(Breadth First Search) "꼼꼼하게 좌우를 살피며 다니자"와 같이 시작 정점으로부터 가까운 정점을 먼저 방문하고 멀리 떨어져 있는 정점을 나중에 방문하는 알고리즘이다. 시작 정
minhamina.tistory.com
'Programming > JAVA' 카테고리의 다른 글
[프로그래머스] 타겟 넘버(level 2, DFS) (0) | 2024.10.10 |
---|---|
[프로그래머스] 타겟 넘버(level 2, BFS) (0) | 2024.10.10 |
DFS 개념 (1) | 2024.09.17 |
이분 탐색(Binary Search) 개념과 구현 (0) | 2024.09.17 |
[프로그래머스] 완주하지 못한 선수(level1, HashMap) (0) | 2024.09.17 |