요구능력 : DFS와 인접리스트에 대한 이해
코드설명 :
평범한 DFS문제처럼 인접리스트를 구해준다.
문제에서 따로 함수를 빠져나갈 조건이 나오지 않았으므로 사실 depth도 필요는 없다. 그냥적은거다.
조건이 없으니 방문처리만하고 나가는 처리는 할필요가 없다.
여기서 핵심은 인접리스트를 다 돌면서 이미 방문한 노드들은 돌지않고
돌게되는 인접리스트는 카운트를 해주는 것이다.
이미 방문한 노드들은 한개의 묶음의 노드이기 때문이다. (하나의 연결요소이기 때문이다.)
DFS는 같은 묶음에 있는 노드는 다 돌게 되어있다.
그러니 방문하지 않은 노드는 다른 연결요소라는 뜻이다.
후기 : DFS문제는 아직 어렵다 .. 적응이 좀 더 필요하다..
let arr = readLine()!.split(separator: " ").map{Int(String($0))!}
let n = arr[0] //정점의 개수
let m = arr[1] //간선의 개수
var depth = 0
var list: [[Int]] = Array(repeating: [], count: n + 1)
var visited: [Bool] = Array(repeating: false, count: n + 1)
var count = 0
for _ in 1...m {
let line = readLine()!.split(separator: " ").map{Int(String($0))!}
list[line[0]].append(line[1])
list[line[1]].append(line[0])
}
func dfs(_ now: Int ,_ depth: Int) {
visited[now] = true
for i in 0..<list[now].count{
let next = list[now][i]
if !visited[next]{
dfs(next, depth + 1)
}
}
}
for i in 1...n{ //핵심
if !visited[i]{
count += 1
dfs(i, depth)
}
}
print(count)
'Algorithm > 문제풀이_백준' 카테고리의 다른 글
[Swift][DFS] 백준 15651번 (N과 M (3)) (0) | 2021.09.27 |
---|---|
[Swift][BFS] 백준 1697번 (숨바꼭질) (0) | 2021.09.27 |
[Swift][DFS] 백준 13023번 (ABCDE) (0) | 2021.09.25 |
[Swift][DFS][BackTracking] 백준 15650번 (N과 M(2)) (0) | 2021.09.25 |
[Swift][BruteForce] 백준 10974번 (모든 순열) (0) | 2021.09.24 |
댓글