Coding Test/BaekJoon_Python
백준 1149 <RGB 거리> Python
JunOnJuly
2023. 10. 30. 19:59
728x90
https://www.acmicpc.net/problem/1149
1149번: RGB거리
첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 1번 집부터 한 줄에 하나씩 주어진다. 집을 칠하는 비용은 1,000보다 작거나
www.acmicpc.net
전형적인 DP 기본 문제입니다. 하지만 처음 선택한 색에 따라 최솟값이 달라지므로 시작이 다른 세 가지 경우 모두 값을 계산해보고 그 중 최솟값을 출력해야 합니다.
def solution(N, data_list):
# 인덱스 맞추기
data_list = [[0, 0, 0, 0]] + data_list
# 시스템 상 최댓값
inf = 1000001
# 2차원 DP
# 첫 선택에 따라 최솟값이 달라지므로
# R, G, B 세 개로 나눠야 한다
memo_R = [[0 for _ in range(4)] for __ in range(N+1)]
memo_G = [[0 for _ in range(4)] for __ in range(N+1)]
memo_B = [[0 for _ in range(4)] for __ in range(N+1)]
# 초깃값 설정
memo_R[1] = [0, data_list[1][1], inf, inf]
memo_G[1] = [0, inf, data_list[1][2], inf]
memo_B[1] = [0, inf, inf, data_list[1][3]]
# 메모 최신화
for i in range(2, N+1):
for j in range(1, 4):
memo_R[i][j] = min([memo_R[i-1][k] if k != j else inf for k in range(1, 4)]) + data_list[i][j]
memo_G[i][j] = min([memo_G[i-1][k] if k != j else inf for k in range(1, 4)]) + data_list[i][j]
memo_B[i][j] = min([memo_B[i-1][k] if k != j else inf for k in range(1, 4)]) + data_list[i][j]
# 각 초깃값에 따른 최솟값
min_R = min(memo_R[-1][1:])
min_G = min(memo_G[-1][1:])
min_B = min(memo_B[-1][1:])
return min(min_R, min_G, min_B)
N = int(input())
data_list = [[0] + list(map(int, input().split())) for _ in range(N)]
print(solution(N, data_list))
728x90