BOJ

[백준/BOJ] python 1149번 RGB거리

kyj0015 2023. 2. 3. 16:16

언어: python

번호: 1149

제목: RGB거리

등급: 실버1

 

풀이 과정:

​DP(동적계획법)으로 풀 수 있다. 집의 색깔은 빨강, 초록, 파랑 중에 하나로 칠해야 한다. 이때 i번째(1<i<n) 집을 한 색으로 칠하기 위해서는 i-1번째 집을 그 색을 제외한 나머지 색깔 중 비용이 적은 것으로 칠하면 된다.

i번째 집은 파랑 > i-1번째 집이 빨강 또는 초록 중에 비용이 적은 것

 i번째 집은 빨강 > i-1번째 집이 초록 또는 파랑 중에 비용이 적은 것

 i번째 집은 초록 > i-1번째 집이 파랑 또는 빨강 중에 비용이 적은 것

으로 칠하면 된다. 2차원 배열 DP[n][3]을 만들어 n번째 열에 n번째 집을 칠하는 색깔에 따라 생기는 비용의 총합을 저장해 가장 작은 값을 출력하면 된다. 

예제 입력 1

3
26 40 83
49 60 57
13 89 99

 

dp[n][3] 1번째 2번째 3번째 모든 집을 칠하는 비용
빨강 26 min(40, 83) + 49 = 89 min(96, 73) + 13 = 86 86
초록 40 min(26, 83) + 60 = 96 min(89, 73) + 89 = 162 162
파랑 83 min(26, 40) + 47 = 73 min(89, 96) + 99 = 188 188

 

 

코드:

# 1149
import sys
input = sys.stdin.readline

n = int(input())
dp = []

for i in range(n):
    dp.append(list(map(int, input().split())))

for i in range(1, n):
    dp[i][0] = dp[i][0] + min(dp[i-1][1], dp[i-1][2])
    dp[i][1] = dp[i][1] + min(dp[i-1][0], dp[i-1][2])
    dp[i][2] = dp[i][2] + min(dp[i-1][0], dp[i-1][1])

print(min(dp[n-1]))