Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- 일정관리프로젝트
- Lv.0
- 네트워크
- JPA
- 포트폴리오
- Java
- 연습문제
- SQL
- LV02
- 이것이 자바다
- Redis
- LV1
- 포트 폴리오
- LV0
- 코테
- LV01
- docker
- CoffiesVol.02
- mysql
- LV03
- jpa blog
- Spring Frame Work
- 프로그래머스
- 디자인 패턴
- Join
- 알고리즘
- LV.02
- 데이터 베이스
- Til
- 배열
Archives
- Today
- Total
코드 저장소.
BFS ? 본문
목차
1.BFS?
2.BFS의 특징
3.작동원리 및 의사코드 구현
1.BFS?
BFS는 너비 우선 탐색이라고도 부르며, 코딩테스트에서 빈번하게 나오는 알고리즘이다. 가까운 노드 부터 우선적으로 탐색하며, 기본적으로 그래프 탐색에 사용된다.두 노드 사이의 최단 경로 혹은 임의의 경로를 찾고자 할 때 주로 사용된다.
BFS는 자료구조 큐(Queue)를 사용하여 구현 할 수 있다.
2.BFS의 특징
탐색 순서
- 시작 정점에서 가까운 정점부터 탐색합니다.
- 동일한 깊이에 있는 정점들을 모두 탐색한 후, 더 깊은 단계로 진행합니다.
- 계층적 탐색: 그래프를 레벨 단위로 탐색한다고 볼 수 있습니다.
자료구조
- BFS는 큐(Queue) 자료구조를 사용합니다.
- FIFO(First In, First Out) 원칙을 따라 먼저 큐에 들어간 정점부터 탐색합니다.
- 방문할 노드들을 큐에 차례로 넣고, 탐색이 끝난 노드들은 큐에서 제거합니다.
최단 경로 탐색
- BFS는 가중치가 없는 그래프에서 시작 정점에서 다른 모든 정점까지의 최단 경로를 찾는 데 효과적입니다.
- 첫 번째로 방문하는 경로가 최단 경로라는 점에서 DFS와 차별화됩니다.
방문 순서 보장
- BFS는 그래프의 구조에 따라 방문 순서를 정확히 보장합니다.
- 동일한 레벨의 정점들은 입력 순서에 따라 탐색됩니다.
3.작동원리 및 의사코드구현
BFS의 작동원리.
- 초기화:
- 시작 정점을 큐에 삽입하고 방문 처리를 합니다.
- 반복:
- 큐에서 정점을 하나 꺼냅니다.
- 꺼낸 정점에 연결된 인접 정점들을 확인합니다.
- 방문하지 않은 인접 정점은 방문 처리 후 큐에 삽입합니다.
- 종료:
- 큐가 비면 탐색을 종료합니다.
import java.util.*;
public class BFSExample {
// 그래프를 표현하는 인접 리스트
private Map<Integer, List<Integer>> graph;
public BFSExample() {
this.graph = new HashMap<>();
}
// 그래프에 간선 추가
public void addEdge(int from, int to) {
graph.putIfAbsent(from, new ArrayList<>());
graph.get(from).add(to);
}
// BFS 구현
public void bfs(int start) {
Queue<Integer> queue = new LinkedList<>(); // BFS를 위한 큐
Set<Integer> visited = new HashSet<>(); // 방문한 노드를 저장
queue.offer(start); // 시작 노드를 큐에 삽입
visited.add(start); // 시작 노드를 방문 처리
while (!queue.isEmpty()) {
int current = queue.poll(); // 큐에서 노드 꺼내기
System.out.println("Visited: " + current); // 현재 노드 처리
// 현재 노드의 모든 인접 노드 탐색
List<Integer> neighbors = graph.getOrDefault(current, new ArrayList<>());
for (int neighbor : neighbors) {
if (!visited.contains(neighbor)) { // 방문하지 않은 노드만 처리
visited.add(neighbor); // 방문 처리
queue.offer(neighbor); // 큐에 추가
}
}
}
}
// 메인 메서드
public static void main(String[] args) {
BFSExample bfsExample = new BFSExample();
// 그래프 정의
bfsExample.addEdge(1, 2);
bfsExample.addEdge(1, 3);
bfsExample.addEdge(2, 4);
bfsExample.addEdge(2, 5);
bfsExample.addEdge(3, 6);
bfsExample.addEdge(4, 7);
// BFS 실행
System.out.println("BFS 탐색 결과:");
bfsExample.bfs(1); // 시작 정점: 1
}
}
참고
'ComputerScience > 알고리즘' 카테고리의 다른 글
브루트 포스 (0) | 2025.01.04 |
---|---|
DFS? (0) | 2025.01.02 |
[알고리즘] 퀵 정렬 (0) | 2023.01.30 |
[알고리즘] 병합정렬 (0) | 2023.01.30 |
[알고리즘] 삽입정렬 (0) | 2023.01.06 |