문제
10451번: 순열 사이클
1부터 N까지 정수 N개로 이루어진 순열을 나타내는 방법은 여러 가지가 있다. 예를 들어, 8개의 수로 이루어진 순열 (3, 2, 7, 8, 1, 4, 5, 6)을 배열을 이용해 표현하면 \(\begin{pmatrix} 1 & 2 &3&4&5&6&7&8 \\ 3
www.acmicpc.net
풀이
DFS를 활용해 순열 사이클을 구할 수 있다.
입력받은 배열에는 다음으로 이동할 위치를 가르키고 있기 때문에 현재 위치는 방문 표시를 해주고 가르키는 위치로 DFS 탐색을 해주면 된다. 만약 현재 위치에서 가르키는 위치가 이미 방문했던 위치인 경우, 순열 사이클이 만들어진 것이다.
반복문을 통해 각 위치에서 시작하는 사이클을 구하면 되는데, 이미 방문했던 위치는 사이클에 포함되어 있는 것이므로 DFS를 실행하지 않는다.
코드
fun main() {
val br = System.`in`.bufferedReader()
val bw = System.out.bufferedWriter()
val sb = StringBuilder()
repeat(br.readLine().toInt()) {
val num = br.readLine().toInt()
val arr = br.readLine().split(' ').map { it.toInt() - 1 }
val visited = BooleanArray(num)
fun dfs(depth: Int) {
visited[depth] = true
val next = arr[depth]
if(!visited[next]) {
dfs(next)
}
}
var cnt = 0
for(i in 0 until num) {
if(!visited[i]) {
dfs(i)
cnt++
}
}
sb.append("$cnt\n")
}
bw.write(sb.toString())
bw.flush()
bw.close()
br.close()
}
'알고리즘 > Baekjoon' 카테고리의 다른 글
[백준] 1743번: 음식물 피하기 - Kotlin[코틀린] (0) | 2023.12.21 |
---|---|
[백준] 1965번: 상자넣기 - Kotlin[코틀린] (0) | 2023.12.20 |
[백준] 1072번: 게임 - Kotlin[코틀린] (0) | 2023.12.19 |
[백준] 1213번: 팰린드롬 만들기 - Kotlin[코틀린] (0) | 2023.12.18 |
[백준] 1449번: 수리공 항승 - Kotlin[코틀린] (0) | 2023.12.17 |