https://www.acmicpc.net/problem/9466
난이도
골드 3
사용언어
Swfit
카테고리
DFS
풀이과정
텀 프로젝트 문제는 원형 트리가 생기면 그 노드끼리 팀이 형성되고, 최종적으로 팀에 속하지 못한 노드의 수를 구하는 문제이다.
문제의 핵심은 사이클이 형성된 노드의 개수를 구하는 것이다.
(사이클이 형성됐다. == 특정 노드가 2번 탐색되었다.)
때문에 visited 배열 변수를 두어 탐색이 된 노드인지 아닌지 판별한다.
탐색되지 않은 노드이면, 탐색을 이어가고, 이미 탐색이 된 노드이면, 사이클이 형성되었기 때문에 사이클에 포함 되는 노드의 수를 계산해 준다.
(예를들어, 1->2->3->4->1 => 1, 2, 3, 4가 한팀이 된다. 때문에 count = 4)
또한, 이미 팀이 형성된 노드거나, 팀에 포함되지 못한 노드는 두 번 탐색할 필요가 없기 때문에, done 배열 변수를 두어 중복 탐색되는 것을 막아 시간 복잡도를 낮춰줄 수 있다.
때문에 if OR else if 로직이 끝나고 해당 노드의 done값에 true를 저장한다.
Code
let t = Int(readLine()!)!
var results = [Int]()
for _ in 0..<t {
let r = Int(readLine()!)!
let choice = [0] + readLine()!.split(separator: " ").map { Int($0)! }
if choice == Array(0...r) {
results.append(0)
continue
}
var visited = Array(repeating: false, count: r + 1)
var done = Array(repeating: false, count: r + 1)
var count = 0
func dfs(start: Int) {
visited[start] = true
var n = choice[start]
if !visited[n] {
dfs(start: n)
} else if !done[n] {
while n != start {
count += 1
n = choice[n]
}
count += 1
}
done[start] = true
}
for i in 1...r {
if !visited[i] {
dfs(start: i)
}
}
results.append(r - count)
}
results.forEach {
print($0)
}
'코테' 카테고리의 다른 글
[완전 탐색] 백준 브론즈2 2231번: 분해합(Swift) (0) | 2023.05.12 |
---|---|
[구현 + 시뮬레이션] 백준 2578번: 빙고 (0) | 2023.05.08 |
[DFS] 백준 1068번: 트리(Swift) (0) | 2022.11.18 |
[BFS + 구현] 백준 2573번: 빙산 (0) | 2022.11.14 |
[DFS] 백준 1707번: 이분 그래프(Swift) (0) | 2022.11.11 |