백준 [1149] - kotlin

[문제]

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

 

1149번: RGB거리

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

www.acmicpc.net

[풀이]

문제의 조건은 다음과 같다.

  • 1번 집의 색은 2번 집의 색과 같지 않아야 한다.
  • N번 집의 색은 N-1번 집의 색과 같지 않아야 한다.
  • i(2 ≤ i ≤ N-1)번 집의 색은 i-1번, i+1번 집의 색과 같지 않아야 한다.

결국 i번째는 i-1째 집의 색과 같지 않으면 된다.

 

예를 들어 i번째 색상이 빨강이라면,  i -1번째는 파랑 또는 초록이 와야 한다. 

i-1째의 최소 값의 색상을 구하여, i번째 색상을 더해준다.

 

최종적으로 N번째 집 중 가장 작은 값을 출력해주면 된다.

[코드]

import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
import kotlin.math.min

lateinit var rgb : Array<MutableList<Int>>
var rgbPair = listOf<Pair<Int,Int>>(Pair(1,2), Pair(0,2), Pair(0,1))
fun main() {
    val br = BufferedReader(InputStreamReader(System.`in`))
    val bw = BufferedWriter(OutputStreamWriter(System.out))

    val N = br.readLine().toInt()
    rgb = Array(N + 1){ mutableListOf() }
    rgb[0] = MutableList(3) {0}
    repeat(N)
    {
        i ->
        rgb[i + 1] = br.readLine().split(" ").map{it.toInt()} as MutableList<Int>
    }

    for(i in 1..N)
    {
        for(j in 0 until 3)
        {
            rgb[i][j] = min(rgb[i-1][rgbPair[j].first], rgb[i-1][rgbPair[j].second]) + rgb[i][j]
        }
    }

    bw.write(min(min(rgb[N][0],rgb[N][1]),rgb[N][2]).toString())
    bw.flush()
    bw.close()
}

'백준 > DP' 카테고리의 다른 글

백준 [3687] kotlin  (0) 2023.01.16
백준 [1446] kotlin  (0) 2023.01.12
백준 [15989] kotlin  (0) 2023.01.11
백준 14501 [kotlin]  (0) 2022.07.22
백준 1309 [kotlin]  (0) 2022.07.09