Files
baekjoon-study/workbook_7319/silver/1149-s1.py
2026-03-29 00:52:06 +09:00

39 lines
1.7 KiB
Python

# RGB 거리
import sys
input = sys.stdin.readline
def solution():
n = int(input().rstrip())
lst = [list(map(int, input().rstrip().split())) for _ in range(n)]
dp = [[float('inf') for _ in range(3)] for _ in range(n)]
dp[0] = lst[0]
for i in range(1, n):
for j in range(3):
dp[i][j] = min([dp[i-1][k]+lst[i][j] for k in range(3) if k != j])
print(min([dp[n-1][j] for j in range(3)]))
return
solution()
"""
걸린 시간: 20분
시간 복잡도: n*3의 dp 테이블을 채워야 하기 때문에 O(n)이다.
해설: 트리 형식으로 완전탐색을 해야할 것 같지만, 최선의 플레이만 잘 저장해놓으면 많이 배제시키고 할 수 있다.
bfs, 완전탐색, 백트래킹 같은 것이 떠오를 때, dp를 생각해보자.
현재 줄에서 3가지 중 하나를 볼때, 본인을 제외한 2가지 경우에 대해서 최선이 보장되어 있다면 지금 선택하는 색깔에 대해 최선의 과거를 가져온 것이다.
물론 지금의 선택이 최종 최선을 보장하진 않기 때문에 모든 색깔에 대해 모든 줄에서 최선의 선택을 하고, 마지막에는 그 최선들 중에 최선을 고르면 된다.
그럼 그리디 아니냐 할 수 있는데, 그리디로 커버할 수 없는 경우까지 커버하는 것이 이 풀이이다.
그리디는 계속 그 줄에서 최소를 선택하는 것이지만, 현재 보이는 최소만 선택했을 때 바로 다음에 같은 색깔로 굉장히 작은 숫자가 나오면 최선이 아니게 된다.
따라서 각 줄에서 3가지 중 뭘 선택했을 때 최선인지 모르기 때문에 3가지 색깔에 대해 그 전에 왔던 최선의 길을 계속 보장하는 것이다.
"""