백준 문제풀이
17404번 - RGB거리 2 / gold 4 / DP
RonLee
2022. 12. 27. 18:11
https://www.acmicpc.net/problem/17404
17404번: RGB거리 2
첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 1번 집부터 한 줄에 하나씩 주어진다. 집을 칠하는 비용은 1,000보다 작거나
www.acmicpc.net
'''
17404번 - RGB거리 2 / gold 4 / DP
'''
import sys
input = sys.stdin.readline
INF = int(1e9)
n = int(input())
arr = []
for _ in range(n):
arr.append(list(map(int, input().split())))
min_value = INF
# 첫 인덱스에서 R,G,B 선택
for i in range(3):
dp = [[INF, INF, INF] for _ in range(n)]
dp[0][i] = arr[0][i]
# dp 알고리즘
for j in range(1, n):
dp[j][0] = min(dp[j - 1][1], dp[j - 1][2]) + arr[j][0]
dp[j][1] = min(dp[j - 1][0], dp[j - 1][2]) + arr[j][1]
dp[j][2] = min(dp[j - 1][0], dp[j - 1][1]) + arr[j][2]
# 처음 선택한 i와 다른 인덱스 중 최소값 갱신
for index in range(3):
if index != i:
min_value = min(min_value, dp[n - 1][index])
print(min_value)
- 첫 인덱스 R,G,B 선택
- i = 0이면, 첫번째 집을 R로 선택한 것
- dp 리스트를 arr 안의 인덱스와 같게 만들고, 최댓값을 넣어둔다.
- dp[0][i] = arr[0][i]로 갱신 하기
- 예제 1) dp =[[26, INF, INF] [INF,INF,INF] [INF,INF,INF]]
- DP 알고리즘 실행
- dp의 전 인덱스의 다른 색깔 두 가지 경우 중 최솟값 + arr의 현재 인덱스 위치에 있는 값
- 예제 1) dp = [[26, INF, INF], [INF, 86, 83], [96, 172, 185]]
- 처음 선택한 i 를 제외한 나머지 인덱스 중 최소값 갱신
- dp[n-1] =[96, 172, 185] 이고, i=0 이므로 빨강 인덱스 제외 중 가장 작은 수 선택
- min_value = 172