반응형
이번 시간에는 DFS
에 이어 또 다른 그래프 탐색 방법인 BFS
에 대해 정리해보려고 합니다.
BFS 너비 우선 탐색(Breadth-First Search)
정의 : 루트 노드(혹은 다른 임의의 노드)에서 시작해서 인접한 노드를 먼저 탐색하는 방법
보통 두 노드 사이의 최단 경로를 찾고 싶을 때 사용합니다. 큐(Queue)
를 사용하여 구현합니다. 이때 주의할 것은 어떤 노드를 방문했었는지 여부를 반드시 검색해야 합니다. 보통 모든 depth를 한 번에 탐색하기 때문에 단순 검색 속도는 DFS
보다 빠릅니다. 하지만 노드의 수가 많아지고 깊이가 깊어지면 비효율적이라는 단점이 있습니다.
특징을 정리하면
Queue
를 사용하여 구현, 이는 탐색할 정점들을 저장함으로써 저장공간이 많이 필요- 그래프가 깊지 않고 규모가 작을 때 효율적
- 단순 검색 속도는
DFS
보다 빠름 - 너비를 우선 탐색하기 때문에 최단 경로임을 보장
🔰 코드(Kotlin)
import java.util.*
val queue : Queue<Int> = LinkedList()
const val nodeSize = 10
val graph = Array(101){Array<Int>(101){0}}
val visits = Array(101){false}
fun main(){
//그래프 생성
graph[1][2] = 1
graph[2][1] = 1
graph[1][3] = 1
graph[3][1] = 1
graph[2][5] = 1
graph[5][2] = 1
//BFS 탐색 시작
bfs(1)
}
fun bfs(x: Int){
var temp =0
//큐에 삽입
queue.add(x)
//방문 표시
visits[x] = true
while (queue.isNotEmpty()){
temp = queue.poll()
print("$temp ")
//temp와 연결된 모든 노드 queue에 저장
for(i in 1..nodeSize){
if(!visits[i] && graph[temp][i] == 1){
//큐 삽입
queue.add(i)
//방문 확인
visits[i] = true
}
}
}
}
//Print Result => 1 2 3 5
반응형
'컴퓨터 공학 > 알고리즘' 카테고리의 다른 글
[알고리즘 / Kotiln] 프로그래머스 - 수식 최대화 (2020 카카오 인턴십) (0) | 2022.02.08 |
---|---|
[알고리즘] DFS(Depth-First Search) - 깊이 우선 탐색 (0) | 2021.12.01 |
[알고리즘 / Kotlin] 프로그래머스 - 큰 수 만들기 (0) | 2021.11.22 |
[알고리즘 / JAVA] 까먹지 않기 위한 기본 정렬 알고리즘 (0) | 2021.11.10 |
[알고리즘 / Kotlin] 프로그래머스 - (10주차)교점에 별 만들기 (0) | 2021.10.17 |
댓글