링크 :https://www.acmicpc.net/problem/1261

 

1261번: 알고스팟

첫째 줄에 미로의 크기를 나타내는 가로 크기 M, 세로 크기 N (1 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 미로의 상태를 나타내는 숫자 0과 1이 주어진다. 0은 빈 방을 의미하고, 1은 벽을 의미

www.acmicpc.net

문제에서 주어진 배열에서

벽은 거리가 1인 노드,

벽이 없는 빈 방은 거리가 0인 노드라고 계산해서

시작점에서 마지막 노드까지 다익스트라를 돌려 최단거리를 구하는 방식의 풀이로 문제를 해결했다.

 


소스코드 (Dijkstra)

import java.io.BufferedReader
import java.io.FileInputStream
import java.io.InputStreamReader
import java.lang.System
import java.util.*

private val MY = arrayOf(1,-1,0,0)//상하좌우
private val MX = arrayOf(0,0,-1,1)//상하좌우

private var M = 0 //가로 (1 ≤ N, M ≤ 100)
private var N = 0 //세로
private lateinit var map :List<MutableList<Int>>
private lateinit var distanceList :MutableList<Int>
private fun main(){
    val br = BufferedReader(InputStreamReader(System.`in`))
    val st = StringTokenizer(br.readLine())
    M = st.nextToken().toInt()
    N = st.nextToken().toInt()
    map = List(N){br.readLine().toCharArray().map { it.digitToInt() }.toMutableList() }
    distanceList = MutableList(N*M){Int.MAX_VALUE}
    distanceList[0] = 0
    dijkstra()

    println(distanceList.last())
}
private fun dijkstra(){
    val PQ = PriorityQueue<Node>()
    PQ.add(Node(0,0,0))
    while (PQ.isNotEmpty()){
        val node = PQ.poll()
        if (distanceList[node.num] < node.count) continue

        for (i in 0 until 4){
            val nextY = node.y + MY[i]
            val nextX = node.x + MX[i]
            if (isInMap(nextY,nextX)){
                val cost = if (map[nextY][nextX] == 0) node.count else node.count + 1
                if (cost < distanceList[getNodeNum(nextY,nextX)]){
                    distanceList[getNodeNum(nextY,nextX)] = cost
                    PQ.add(Node(nextY,nextX,cost))
                }
            }
        }
    }
}
private fun getNodeNum(y :Int, x:Int) :Int = y * M + x

private fun isInMap(y :Int, x:Int)
    = (y in 0 until N) && (x in 0 until M)

data class Node(
    val y :Int,
    val x :Int,
    val count :Int,
    val num :Int = y * M + x
): Comparable<Node> {
    override fun compareTo(other: Node): Int
        = this.count - other.count // 오름차순
}

'Algorithm_Kotlin' 카테고리의 다른 글

[Kotlin] BOJ2665 미로만들기  (0) 2023.02.03
[Kotlin] BOJ5972 택배 배송  (0) 2023.02.01
[Kotlin] BOJ1238 파티  (0) 2023.01.30
[Kotlin] BOJ10473 인간 대포  (1) 2023.01.27
[Kotlin] BOJ1525 퍼즐  (0) 2023.01.24