240325 TIL #355 CT_RGB거리 (DP)

김춘복·2024년 3월 25일
0

TIL : Today I Learned

목록 보기
355/571

Today I Learned

오늘은 코틀린 코테 공부!


RGB거리

백준 1149번 https://www.acmicpc.net/problem/1149

문제

RGB거리에는 집이 N개 있다. 거리는 선분으로 나타낼 수 있고, 1번 집부터 N번 집이 순서대로 있다.
집은 빨강, 초록, 파랑 중 하나의 색으로 칠해야 한다. 각각의 집을 빨강, 초록, 파랑으로 칠하는 비용이 주어졌을 때, 아래 규칙을 만족하면서 모든 집을 칠하는 비용의 최솟값을 구해보자.

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

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

  • 입력
    3
    26 40 83
    49 60 57
    13 89 99
  • 출력 96

풀이 과정

  • 2차원 배열과 DP를 이용해 각 집의 최소 비용을 계싼해 마지막 집의 최소비용을 알아내는 방법을 사용했다.
  1. n과 cost를 입력으로 받아주고 rgb 비용도 받아준다. costs는 2차원 배열로 n개의 줄을 받는다.

  2. DP를 위한 이차원 배열 dp를 초기화 한다. 첫 집은 dp[0]에 저장한다. dp[i][j]는 i번째 집까지 칠하고 j번째 색깔을 선택했을 때의 최소비용을 의미한다.

  3. 두 번째 집부터 마지막 집까지 각각을 빨강, 초록, 파랑으로 칠할 때의 최소 비용을 계산한다. 현재 집을 R로 칠할 때의 최소 비용은 이전 집을 G나 B로 칠한 경우 중에서 최소 비용을 선택하고, 현재 집을 빨강으로 칠하는 비용을 더하여 구한다. 이를 각각의 색에 대해 계산하고, 이 과정을 반복해 dp 배열에 최소 비용을 갱신해 나간다.

  4. 마지막 집을 각 색으로 칠했을 때의 최소 비용 중에서 가장 작은 값을 출력하면 완료.


Kotlin 코드

import kotlin.math.min

fun main() {
    val n = readln().toInt()
    val costs = Array(n) { IntArray(3) }

    // 각 집을 RGB로 칠하는 비용
    for (i in 0 until n) {
        val (r, g, b) = readln().split(" ").map { it.toInt() }
        costs[i][0] = r
        costs[i][1] = g
        costs[i][2] = b
    }

    // DP 배열 초기화
    val dp = Array(n) { IntArray(3) }
    dp[0] = costs[0]

    // 현재 집을 RGB로 칠할 때 최소 비용을 계산하여 DP 배열에 저장
    for (i in 1 until n) {
        dp[i][0] = min(dp[i - 1][1], dp[i - 1][2]) + costs[i][0]
        dp[i][1] = min(dp[i - 1][0], dp[i - 1][2]) + costs[i][1]
        dp[i][2] = min(dp[i - 1][0], dp[i - 1][1]) + costs[i][2]
    }

    // 마지막 집을 칠하는 각 경우의 비용 중 최솟값 출력
    val minCost = min(dp[n - 1][0], min(dp[n - 1][1], dp[n - 1][2]))
    println(minCost)
}
profile
Backend Dev / Data Engineer

0개의 댓글