Python/백준

17404_RGB거리2

728x90

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

 

17404번: RGB거리 2

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

www.acmicpc.net

 

 

RGB거리 문제와 동일하지만 첫번째 집과 마지막집이 연결된 형태이다. 

 

첫집과 마지막집의 색이 같아야 하지 않으므로 세 경우를 집어서 생각할 수 있다.

 

첫집을 R로 칠하고 dp를 채워나가 cost를 만든 것중 마지막집을 G,B로 칠한것중 최소비용

첫집을 G로 칠하고 dp를 채워나가 cost를 만든 것중 마지막집을 R,B로 칠한것중 최소비용

첫집을 B로 칠하고 dp를 채워나가 cost를 만든 것중 마지막집을 R,G로 칠한것중 최소비용 

 

 

이걸 구현하기 위해서 3번 비용을 계산하는데, 첫집의 비용을 R로 잡았다고 치면 G,B를 칠할 비용을 엄청 크게 잡아서 선택되지 않게 하였다.

 

마찬가지로 마지막에 최소비용을 구할때도 같은 방식을 사용하였다.

import sys
input = sys.stdin.readline

n = int(input())
cost = [ list(map(int,input().split())) for _ in range(n)]
result = []
for i in range(3):
    dp = [ [0,0,0] for _ in range(n) ]
    dp[0] = [1e9,1e9,1e9]
    dp[0][i] = cost[0][i]
    for j in range(1,n):
        dp[j][0] = min(dp[j - 1][1], dp[j - 1][2]) + cost[j][0]
        dp[j][1] = min(dp[j - 1][0], dp[j - 1][2]) + cost[j][1]
        dp[j][2] = min(dp[j - 1][0], dp[j - 1][1]) + cost[j][2]

    dp[-1][i] = 1e9
    result.append(min(dp[-1]))
print(min(result))

 

728x90

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

11478_서로다른부분문자열의 개수  (0) 2022.06.06
14425_문자열 집합  (0) 2022.06.02
2098_외판원순회 1  (0) 2022.05.31
11723_집합  (0) 2022.05.29
2162_선분그룹  (0) 2022.05.26