# 풀이
- DP + DFS
- dp테이블은 각 노드 숫자에 해당
- 특정 노드가 시작점이 되었는데 해당 시작지점으로 다시 되돌아온 경우 dp테이블값 초기화
- 순회 노드의 다음 노드가 시작지점 노드가 되는 경우 서브 그래프가 형성되어 순서가 섞여도 모든 숫자들을 포함할 수 있게 된다.
import Foundation
// 위에 뽑은 애들 갯수와 아래 뽑은 애들 갯수가 동일하면 됨
let N = Int(readLine()!)!
var visited: [Bool] = .init(repeating: false, count: N + 2)
var count: [Int] = .init(repeating: 0, count: N+2)
var adj: [[Int]] = .init(repeating: [], count: N + 2)
var dp: [Int] = .init(repeating: 0, count: N+2)
for i in 1...N {
adj[i].append(Int(readLine()!)!)
}
func dfs(_ here: Int, _ start: Int, _ depth: Int) {
visited[here] = true
for there in adj[here] {
if there == start {
dp[there] = depth + 1
}
if visited[there] {
continue
}
dfs(there, start, depth + 1)
}
}
for i in 1...N {
visited = .init(repeating: false, count: N + 2)
dfs(i, i, 0)
}
print(dp.filter({$0 != 0}).count)
dp.enumerated().forEach { index, value in
if value == 0 { return }
print(index)
}