PS(Problem Solving)/BOJ

[백준/BOJ] 4485번: 녹색 옷 입은 애가 젤다지?

JunsuKim 2022. 8. 7.
728x90

문제

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

 

4485번: 녹색 옷 입은 애가 젤다지?

젤다의 전설 게임에서 화폐의 단위는 루피(rupee)다. 그런데 간혹 '도둑루피'라 불리는 검정색 루피도 존재하는데, 이걸 획득하면 오히려 소지한 루피가 감소하게 된다! 젤다의 전설 시리즈의 주

www.acmicpc.net

해설

bfs로도 풀 수 있을 것 같았지만, 다익스트라를 사용해서 문제를 풀었다.

각 칸의 소지금을 우선순위 큐에 오름차순으로 기준을 잡아준다.

기본적인 다익스트라 알고리즘 문제이다.

소스 코드

import java.lang.StringBuilder
import java.util.*

private lateinit var map: Array<IntArray>
private val dx = intArrayOf(1, -1, 0, 0)
private val dy = intArrayOf(0, 0, 1, -1)

data class Pos(val y: Int, val x: Int, val cost: Int): Comparable<Pos> {
    override fun compareTo(other: Pos): Int = cost - other.cost
}

fun main() = with(System.`in`.bufferedReader()) {
    var cnt = 0

    while(true) {
        val size = readLine().toInt()
        if(size == 0) break

        map = Array(size) { IntArray(size) }

        repeat(size) { i ->
            val st = StringTokenizer(readLine())
            repeat(size) { j ->
                map[i][j] = st.nextToken().toInt()
            }
        }

        println("Problem ${++cnt}: ${dijkstra(size)}")
    }
}

private fun dijkstra(size: Int): Int {
    val cost = Array(size + 1) { IntArray(size + 1) { Integer.MAX_VALUE } }
    cost[0][0] = map[0][0]

    val pq = PriorityQueue<Pos>()
    pq.add(Pos(0, 0, cost[0][0]))

    while(pq.isNotEmpty()) {
        val cur = pq.poll()
        val curY = cur.y
        val curX = cur.x
        val curCost = cur.cost

        for(i in 0 until 4) {
            val nextY = curY + dy[i]
            val nextX = curX + dx[i]

            if(nextY !in 0 until size || nextX !in 0 until size) continue

            if(cost[nextY][nextX] > curCost + map[nextY][nextX]) {
                cost[nextY][nextX] = curCost + map[nextY][nextX]
                pq.add(Pos(nextY, nextX, cost[nextY][nextX]))
            }
        }
    }

    return cost[size-1][size-1]
}
728x90

댓글