PS(Problem Solving)/BOJ

[백준/BOJ] 13424번: 비밀 모임

JunsuKim 2022. 9. 7.
728x90

문제

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

 

13424번: 비밀 모임

입력 데이터는 표준 입력을 사용한다. 입력은 T개의 테스트 데이터로 구성된다. 입력의 첫 번째 줄에 테스트 케이스의 개수를 나타내는 자연수 T가 주어진다. 각 테스트 케이스의 첫째 줄에는 방

www.acmicpc.net

해설

각 방 사이 비밀 통로를 이용하는 비용이 나와있다.

플로이드 와샬 알고리즘을 이용하여 각 방 사이를 오가는데 필요한 최소 거리를 구해놓은 후,

현재 친구들이 있는 방에서 각 방까지 가장 작은 비용으로 갈 수 있는 방을 찾으면 된다.

코드

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

private lateinit var map: Array<IntArray>
private const val INF = 987654321

fun main() = with(System.`in`.bufferedReader()) {
    val testCase = readLine().toInt()
    repeat(testCase) { i ->
        val (roomCnt, secretPassageCnt) = readLine().split(" ").map { it.toInt() }

        map = Array(roomCnt + 1) { IntArray(roomCnt + 1) }
        for(i in 1 .. roomCnt) {
            for(j in 1 .. roomCnt) {
                if(i == j) map[i][j] = 0
                else map[i][j] = INF
            }
        }

        repeat(secretPassageCnt) {
            val (from, to, cost) = readLine().split(" ").map { it.toInt() }
            map[from][to] = cost
            map[to][from] = cost
        }

        val friendCnt = readLine().toInt()

        val locateFriendRoom = ArrayList<Int>()
        val st = StringTokenizer(readLine())
        repeat(friendCnt) {
            locateFriendRoom.add(st.nextToken().toInt())
        }


        floyd(roomCnt)

        var ans = 0
        var move = Integer.MAX_VALUE
        for(i in 1 .. roomCnt) {
            var temp = 0
            for(j in locateFriendRoom) {
                if(i == j) continue
                temp += map[j][i]
            }

            if(move > temp) {
                move = temp
                ans = i
            }
        }

        println(ans)
    }
}

private fun floyd(n: Int) {
    for(k in 1 .. n) {
        for(i in 1 .. n) {
            for(j in 1 .. n) {
                map[i][j] = min(map[i][j], map[i][k] + map[k][j])
            }
        }
    }
}
728x90

댓글