코딩테스트에서 가장 출제율이 높다는 DFS와 BFS를 백준 대표 예제를 통해 공부해 보겠습니다.
import java.util.*
fun main() {
val (n,m,v) = readLine()!!.split(" ").map {it.toInt()}
val graph = Array(n+1) {IntArray(n+1)}
var visit = ArrayList<Int>()
repeat(m) {
val (x,y) = readLine()!!.split(" ").map {it.toInt()}
graph[x][y] = 1
graph[y][x] = 1
}
dfs(v, graph, visit) // dfs 탐색
println()
visit = ArrayList<Int>() // 방문 정점 초기화
bfs(v, graph, visit) // bfs 탐색
}
fun dfs(start: Int, graph: Array<IntArray>, visit: ArrayList<Int>) {
visit.add(start)
print("$start ")
for (i in 1 until graph.size) {
if (graph[start][i] == 1&& !visit.contains(i)) {
dfs(i,graph,visit)
}
}
}
fun bfs(start: Int, graph: Array<IntArray>, visit: ArrayList<Int>) {
val queue = LinkedList<Int>()
queue.add(start)
visit.add(start)
while(queue.isNotEmpty()) {
val x = queue.poll()
print("$x ")
for (i in 1 until graph.size) {
if (graph[x][i] == 1 && !visit.contains(i)) {
queue.add(i)
visit.add(i)
}
}
}
}
DFS는 깊이우선탐색으로 재귀를 통해, BFS는 너비우선탐색으로 큐(LinkedList)를 이용합니다.
먼저, 정점이 연결된 경우는 해당 정점에 해당하는 graph의 값을 1로 변경합니다. 방향이 없는 간선이기 때문에 양방향으로 graph의 인덱스 값을 1로 변경합니다.
탐색 시작 정점인 v가 주어지기 때문에 DFS는 v에서 시작해 연결된 정점이 있는 경우 더 이상 연결된 정점이 없을 때까지 재귀함수를 호출해 가면서 깊이 우선으로 탐색합니다.
BFS도 마찬가지로 v에서 시작하지만 시작 정점으로부터 해당 정점에 연결된 정점들을 모두 탐색한 후 다음 깊이의 정점을 탐색합니다.
728x90
반응형
'자료구조&알고리즘' 카테고리의 다른 글
[자료구조] Kotlin으로 자료구조 이해하기 - PriorityQueue(우선순위 큐) (0) | 2023.02.09 |
---|---|
[알고리즘] 그리디 알고리즘 (Kotlin) (0) | 2023.01.30 |
[백준] 1929번 : 소수 구하기, 에라토스테네스의 체 (Kotlin) (0) | 2023.01.27 |
[백준] 1918번 : 후위 표기식 (Kotlin) (3) | 2023.01.26 |
[알고리즘] 유클리드 호제법 + [백준 2609번] (Kotlin) (2) | 2023.01.25 |