[백준] 4485번: 녹색 옷 입은 애가 젤다지? - Kotlin[코틀린]

2023. 11. 30. 16:35·알고리즘/Baekjoon

문제

 

 

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

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

www.acmicpc.net

 


풀이

 

 다익스트라 알고리즘을 사용하여 최단 거리를 찾을 수 있다. 알고리즘은 우선 순위 큐를 활용하여 현재까지 발견된 최단 거리를 가진 정점을 기준으로 탐색한다. 각 정점까지의 사용되는 비용을 저장하는 배열을 만들고 시작 지점의 비용을 초기화해준다. 그 후, 우선 순위 큐에 시작 지점을 추가하고 탐색을 시작한다.

 탐색 중에는 현재까지 저장된 비용보다 더 작은 비용으로 이동할 수 있는 경우에 해당 정점의 비용을 갱신하고 큐에 추가한다. 이 과정을 반복하면서 모든 정점에 대한 최단 거리를 계산할 수 있다.

 

 문제에서 구하는 시작 지점에서 목적지까지의 최소 비용을 출력하면 된다.

 


코드

 

import java.util.*

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

fun main() {
    val br = System.`in`.bufferedReader()
    val bw = System.out.bufferedWriter()

    // 상, 하, 좌, 우 이동을 위한 배열
    val dx = arrayOf(1, 0, -1, 0)
    val dy = arrayOf(0, 1, 0, -1)

    var num = 0
    lateinit var map: Array<IntArray> // 입력받을 지도

    // 다익스트라 알고리즘을 이용한 최단 거리 계산 함수
    fun dijkstra(): Int {
        val cost = Array(num) { IntArray(num) { Int.MAX_VALUE } }
        val queue = PriorityQueue<Point>()

        // 시작 지점 초기화
        cost[0][0] = map[0][0]
        queue.offer(Point(0, 0, map[0][0]))

        while (queue.isNotEmpty()) {
            val cur = queue.poll()

            // 인접한 정점들에 대한 탐색
            for (i in 0 until 4) {
                val nx = cur.x + dx[i]
                val ny = cur.y + dy[i]

                if (nx < 0 || ny < 0 || nx >= num || ny >= num) continue

                // 더 작은 비용으로 갱신 가능한 경우
                if (cost[nx][ny] > cost[cur.x][cur.y] + map[nx][ny]) {
                    cost[nx][ny] = cost[cur.x][cur.y] + map[nx][ny]
                    queue.offer(Point(nx, ny, cost[nx][ny]))
                }
            }
        }

        // 목적지까지의 최단 거리 반환
        return cost[num - 1][num - 1]
    }

    val sb = StringBuilder()
    var time = 1
    while (true) {
        num = br.readLine().toInt()
        if (num == 0) break
        map = Array(num) { IntArray(num) }
        for (i in 0 until num) {
            val st = StringTokenizer(br.readLine())
            for (j in 0 until num) {
                map[i][j] = st.nextToken().toInt()
            }
        }

        sb.append("Problem $time: ${dijkstra()}\n")
        time++
    }

    bw.write(sb.toString())
    bw.flush()
    bw.close()
    br.close()
}

 

'알고리즘 > Baekjoon' 카테고리의 다른 글

[백준] 2346번: 풍선 터트리기 - Kotlin[코틀린]  (0) 2023.12.11
[백준] 2504번: 괄호의 값 - Kotlin[코틀린]  (0) 2023.12.05
[백준] 2529번: 부등호 - Kotlin[코틀린]  (0) 2023.11.29
[백준] 18352번: 특정 거리의 도시 찾기 - Kotlin[코틀린]  (0) 2023.11.28
[백준] 17472번: 다리 만들기 2 - Kotlin[코틀린]  (0) 2023.11.24
'알고리즘/Baekjoon' 카테고리의 다른 글
  • [백준] 2346번: 풍선 터트리기 - Kotlin[코틀린]
  • [백준] 2504번: 괄호의 값 - Kotlin[코틀린]
  • [백준] 2529번: 부등호 - Kotlin[코틀린]
  • [백준] 18352번: 특정 거리의 도시 찾기 - Kotlin[코틀린]
junghoooooon
junghoooooon
  • junghoooooon
    코드팁스
    junghoooooon
  • 전체
    오늘
    어제
    • 전체 (120)
      • 안드로이드 (0)
        • 코드팁스 (0)
      • 유니티 (0)
        • 코드팁스 (0)
      • 알고리즘 (118)
        • 알고리즘 (0)
        • Baekjoon (118)
      • GitHub (0)
      • 티스토리 (2)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      이분 탐색
      DP
      우선순위 큐
      누적 합
      MST
      백트래킹
      스택
      티스토리
      피보나치
      모듈러 곱셈 역원
      투 포인터
      그리디
      구현
      프림
      dfs
      그래프이론
      분할 정복
      재귀
      유니온파인드
      수학
      크루스칼
      문자열
      에라토스테네스의 체
      브루트포스
      BFS
      정렬
      분리집합
      그래프 탐색
      큐
      소수 판정
    • hELLO· Designed By정상우.v4.10.2
    junghoooooon
    [백준] 4485번: 녹색 옷 입은 애가 젤다지? - Kotlin[코틀린]
    상단으로

    티스토리툴바