https://www.acmicpc.net/problem/24484
24484번: 알고리즘 수업 - 깊이 우선 탐색 6
정점 1번에서 정점 4번을 방문한다. 정점 4번에서 정점 3번을 방문한다. 정점 3번에서 정점 2번을 방문한다. 정점 5번은 정점 1번에서 방문할 수 없다. 따라서, ti 값은 1번 정점부터 1, 4, 3, 2, 0이다
www.acmicpc.net
난이도 : 실버 2
태그 : 깊이 우선 탐색, 정렬, 그래프 탐색, 그래프 이론
설명
깊이 우선 탐색 1-2번 + 3-4번을 합친 형태면서,
깊이 우선 탐색 5번의 내림차순 방문 버전입니다.
1~5번을 푸신 분들이라면 별로 어렵지 않게 푸실 수 있을 문제입니다.
1번 노드 | 2번 노드 | 3번 노드 | 4번 노드 | 5번 노드 | 6번 노드 | |
순서 | 1 | 4 | 2 | 6 | 5 | 3 |
깊이 | 0 | 1 | 1 | 3 | 2 | 2 |
순서 * 깊이 | 0 | 4 | 2 | 18 | 10 | 6 |
0 + 4 + 2 + 18 + 10 + 6 = 40으로,
5번과는 오름차순 <-> 내림차순 방문만 다를 뿐, 풀이방식은 동일합니다.
소스코드
import java.util.*
import kotlin.collections.ArrayList
lateinit var connect: Array<ArrayList<Int>>
lateinit var depth: Array<Int>
lateinit var sequence: Array<Int>
var sequenceIdx = 2
var n = 0
fun main() = with(System.`in`.bufferedReader()) {
val st = StringTokenizer(readLine())
n = st.nextToken().toInt()
val (m, start) = Array(2) { st.nextToken().toInt() }
connect = Array(n + 1) { ArrayList<Int>() }
depth = Array(n + 1) { -1 }
sequence = Array(n + 1) { 0 }
repeat(m) {
val st = StringTokenizer(readLine())
val (v1, v2) = Array(2) { st.nextToken().toInt() }
connect[v1].add(v2)
connect[v2].add(v1)
}
connect.forEach { it.sortDescending() }
depth[start] = 0
sequence[start] = 1
dfs(start)
var sum = 0L
for (i in 1..n) sum += depth[i].toLong() * sequence[i].toLong()
println(sum)
}
fun dfs(node: Int) {
connect[node].forEach { next ->
if (depth[next] == -1) {
depth[next] = depth[node] + 1
sequence[next] = sequenceIdx++
dfs(next)
}
}
}
후기
알고리즘 탐색 - 깊이 우선 탐색 시리즈의 마지막 6번 문제였습니다.
DFS는 BFS와 더불어 코딩테스트를 응시할 때 매우 자주 나오는 유형이므로,
알아두시면 매우 유용하게 쓰실 수 있습니다.
'코딩테스트 > Kotlin' 카테고리의 다른 글
[백준 5373번] [Kotlin] 큐빙 (0) | 2023.09.29 |
---|---|
[백준 17270번] [Kotlin] 연예인은 힘들어 (0) | 2023.09.25 |
[백준 24483번] [Kotlin] 알고리즘 수업 - 깊이 우선 탐색 5 (0) | 2023.09.25 |
[백준 24481번] [Kotlin] 알고리즘 수업 - 깊이 우선 탐색 3 (0) | 2023.09.23 |
[백준 24480번] [Kotlin] 알고리즘 수업 - 깊이 우선 탐색 2 (0) | 2023.09.23 |