본문 바로가기

알고리즘

[백준][KOTLIN] 1149 RGB거리

728x90

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

 

1149번: RGB거리

첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 1번 집부터 한 줄에 하나씩 주어진다. 집을 칠하는 비용은 1,000보다 작거나

www.acmicpc.net

풀이

  • 위의 그림을 통해서 규칙성을 파악한다.
  • 비용을 저장하는 cost 배열과 R, G, B 를 각각 처음으로 칠한 경우를 저장하는 dp 배열을 선언한다.

코드

import java.util.*

fun main(args: Array<String>) {
    val sc = Scanner(System.`in`)
    val N = sc.nextInt()
    val cost = Array(N + 1) { IntArray(3) }
    val dp = Array(N + 1) { IntArray(3) }

    for (i in 1..N) {
        for (j in 0 until 3) {
            cost[i][j] = sc.nextInt()
        }
    }

    for (i in 1..N) {
        // R을 제일 첫 집으로 칠했을때 비용
        dp[i][0] = min(dp[i - 1][1], dp[i - 1][2]) + cost[i][0]
        // G를 제일 첫 집으로 칠했을때 비용
        dp[i][1] = min(dp[i - 1][0], dp[i - 1][2]) + cost[i][1]
        // B를 제일 첫 집으로 칠했을때 비용
        dp[i][2] = min(dp[i - 1][0], dp[i - 1][1]) + cost[i][2]
    }

    val result = min(dp[N][0], min(dp[N][1], dp[N][2]))
    println("$result")
}

private fun min(a: Int, b: Int): Int {
    return if (a > b) b else a
}
728x90