티스토리 뷰
DFS (깊이 우선 탐색) : 최대한 깊숙히, 많이 탐색
- 스택, 재귀호출을 이용
- 해당 정점이 탐색되었는지 체크할 Bool 타입 배열이 필요하다.
- 재귀호출을 사용할 때, 해당 정점이 탐색되었으면 return 해주어야 한다.
- 정점은 탐색되고, 해당 정점으로부터의 간선을 저장한 ArrayList를 순회한다.
- 탐색되지 않은 정점을 찾아 그 정점에서 함수를 재귀호출한다.
BFS (너비 우선 탐색) : 최대한 넒게 탐색, 최단거리
- 큐를 이용
- 해당 정점이 탐색되었는지 체크할 Bool 타입 배열이 필요하다.
- 해당 정점은 탐색되고, 큐에 넣는다.
- 큐의 요소를 빼고, 그 요소로부터의 간선을 저장한 ArrayList를 순회한다.
- 탐색되지 않은 정점을 탐색하였다고 기록하고, 그 정점을 큐에 저장한다.
- 위의 두 문장을 큐가 빌 때까지 진행한다.
기본적으로 위의 사항들을 따라 차근차근 구현하자.
let firstLine = readLine()!.split(separator: " ").map { Int($0)! }
let numberOfVertex = firstLine[0]
let numberOfEdge = firstLine[1]
let startVertex = firstLine[2]
var array = [[Int]].init(repeating: [], count: numberOfVertex + 1)
var isChecked = [Bool].init(repeating: false, count: numberOfVertex + 1)
func bfs(start: Int) {
var queue = [Int]()
isChecked[start] = true
queue.append(start)
while !queue.isEmpty {
let element = queue.removeFirst()
print(element, terminator: " ")
for vertex in array[element] {
if !isChecked[vertex] {
isChecked[vertex] = true
queue.append(vertex)
}
}
}
}
func dfs(start: Int) {
if isChecked[start] {
return
}
isChecked[start] = true
print(start, terminator: " ")
for vertex in array[start] {
if !isChecked[vertex] {
dfs(start: vertex)
}
}
}
for _ in 1...numberOfEdge {
let input = readLine()!.split(separator: " ").map { Int($0)! }
let u = input[0]
let v = input[1]
array[u].append(v)
array[v].append(u)
}
for i in 1...numberOfVertex {
array[i].sort()
}
dfs(start: startVertex)
print()
isChecked = [Bool].init(repeating: false, count: numberOfVertex + 1)
bfs(start: startVertex)
print()
'Algorithm > Baekjoon Online Judge' 카테고리의 다른 글
13241번 '최소공배수' (0) | 2018.08.10 |
---|---|
1181번 '단어 정렬' (0) | 2018.08.10 |
11004번 'K번째 수' (0) | 2018.08.07 |
11652번 '카드' (0) | 2018.08.07 |
10989번 '수 정렬하기 3' (0) | 2018.08.05 |