[백준] 특정 거리의 도시 찾기 (18352)(kotlin)
문제 설명
입력 및 출력
» 입력
첫째 줄에 도시의 개수 N, 도로의 개수 M, 거리 정보 K, 출발 도시의 번호 X가 주어진다. (2 ≤ N ≤ 300,000, 1 ≤ M ≤ 1,000,000, 1 ≤ K ≤ 300,000, 1 ≤ X ≤ N) 둘째 줄부터 M개의 줄에 걸쳐서 두 개의 자연수 A, B가 공백을 기준으로 구분되어 주어진다. 이는 A번 도시에서 B번 도시로 이동하는 단방향 도로가 존재한다는 의미다. (1 ≤ A, B ≤ N) 단, A와 B는 서로 다른 자연수이다.
» 출력
- X로부터 출발하여 도달할 수 있는 도시 중에서, 최단 거리가 K인 모든 도시의 번호를 한 줄에 하나씩 오름차순으로 출력한다. 이 때 도달할 수 있는 도시 중에서, 최단 거리가 K인 도시가 하나도 존재하지 않으면 -1을 출력한다.
예제 입출력(테스트케이스)
입력 | 출력 |
---|---|
4 4 2 1 1 2 1 3 2 3 2 4 |
4 |
4 3 2 1 1 2 1 3 1 4 |
-1 |
4 4 1 1 1 2 1 3 2 3 2 4 |
2 3 |
문제 풀이1
import java.util.PriorityQueue
class Node(val destination: Int, val cost: Int): Comparable<Node> {
override fun compareTo(other: Node): Int {
return this.cost - other.cost
}
}
fun main() = with(System.`in`.bufferedReader()) {
val (N, M, K, X) = readLine().split(" ").map { it.toInt() }
val adjMatrix = Array(N + 1) { PriorityQueue<Node>() }
repeat(M) {
val (A, B) = readLine().split(" ").map { it.toInt() }
adjMatrix[A].add(Node(B, 1))
}
val result = dijkstra(X, N, K, adjMatrix)
printResult(K, result)
}
fun printResult(K: Int, result: IntArray) {
val list = mutableListOf<Int>()
for (i in result.indices) {
if (result[i] == K) {
list.add(i)
}
}
if (list.isNotEmpty()) {
list.forEach { println(it) }
} else {
println(-1)
}
}
fun dijkstra(start: Int, N: Int, K: Int, adjMatrix: Array<PriorityQueue<Node>>): IntArray {
val check = BooleanArray(N + 1)
val distance = IntArray(N + 1) { Int.MAX_VALUE }
val q = PriorityQueue<Node>()
distance[start] = 0
q.add(Node(start, 0))
while (q.isNotEmpty()) {
val now = q.poll()
if (check[now.destination]) continue
check[now.destination] = true
for (next in adjMatrix[now.destination]) {
if (distance[next.destination] > distance[now.destination] + next.cost) {
distance[next.destination] = distance[now.destination] + next.cost
q.add(Node(next.destination, distance[next.destination]))
}
}
}
return distance
}