PS(Problem Solving)/BOJ

[백준/BOJ] 1082번: 해킹

JunsuKim 2022. 8. 21.
728x90

문제

https://www.acmicpc.net/problem/10282

 

10282번: 해킹

최흉최악의 해커 yum3이 네트워크 시설의 한 컴퓨터를 해킹했다! 이제 서로에 의존하는 컴퓨터들은 점차 하나둘 전염되기 시작한다. 어떤 컴퓨터 a가 다른 컴퓨터 b에 의존한다면, b가 감염되면

www.acmicpc.net

해설

한 컴퓨터가 해킹당했고, 이 컴퓨터에 의존하는 컴퓨터들은 시간이 지남에 따라 전염되기 시작한다.

즉, 한 개의 루트 노드로부터 연결된 노드들이 전부 감염된다는 것이다.

이를 풀기 위해 다익스트라 알고리즘을 응용하였다.

 

다익스트라 알고리즘은 최단 경로를 찾는 알고리즘으로 PriorityQueue를 이용하여 수행해나간다.

하지만 이 문제에서 a, b는 두 번 이상 주어지지 않는다. 즉, 최단 경로라고 할 것이 없다는 것이다.

따라서 나는 Queue를 이용하였다.

 

알고리즘의 수행이 끝나고 나면, 각 컴퓨터에 도달하는 시간들이 전부 구해졌을 것이다.

이때, 초기에 설정해둔 값(Int.MAX_VALUE)이라면 이 컴퓨터는 해킹된 컴퓨터에 의존하지 않는다는 것이다.

초기에 설정해둔 값이 아니라면 해킹된 컴퓨터에 의존하고 있는 것이므로 갯수를 세주고, 이 중 가장 큰 값을 갖고 있는 컴푸터가 모든 컴퓨터가 감염되기까지 걸린 시간을 갖고 있다.

코드

import java.util.*
import kotlin.collections.ArrayList
import kotlin.math.max

private lateinit var graph: Array<ArrayList<Pair<Int, Int>>>
private lateinit var runningTime: IntArray

fun main() = with(System.`in`.bufferedReader()) {
    val testCase = readLine().toInt()
    repeat(testCase) {
        val (computerCnt, dependenceCnt, virusComputer) = readLine().split(" ").map { it.toInt() }

        graph = Array(computerCnt + 1) { ArrayList() }
        runningTime = IntArray(computerCnt + 1) { Int.MAX_VALUE }

        repeat(dependenceCnt) {
            val (aComputer, bComputer, time) = readLine().split(" ").map { it.toInt() }
            graph[bComputer].add(Pair(aComputer, time))
        }

        dijkstra(virusComputer)

        var virus = 0
        var totalTime = 0
        for(i in 1 .. computerCnt) {
            if(runningTime[i] != Int.MAX_VALUE) {
                virus++
                totalTime = max(totalTime, runningTime[i])
            }
        }

        println("$virus $totalTime")
    }
}

private fun dijkstra(virusComputer: Int) {
    val que: Queue<Pair<Int, Int>> = LinkedList()
    que.add(Pair(virusComputer, 0))
    runningTime[virusComputer] = 0

    while(que.isNotEmpty()) {
        val cur = que.poll()
        val curComputer = cur.first
        val curTime = cur.second

        for(i in graph[curComputer].indices) {
            val nextComputer = graph[curComputer][i].first
            val nextTime = curTime + graph[curComputer][i].second

            if(nextTime < runningTime[nextComputer]) {
                runningTime[nextComputer] = nextTime
                que.add(Pair(nextComputer, nextTime))
            }
        }
    }
}

 

728x90

'PS(Problem Solving) > BOJ' 카테고리의 다른 글

[백준/BOJ] 2636번: 치즈  (0) 2022.08.23
[백준/BOJ] 2493번: 탑  (1) 2022.08.22
[백준/BOJ] 1967번: 트리의 지름  (0) 2022.08.20
[백준/BOJ] 2470번: 두 용액  (0) 2022.08.19
[백준/BOJ] 3055번: 탈출  (0) 2022.08.18

댓글