4883-s1 성공

This commit is contained in:
sm4640
2026-03-30 12:00:23 +09:00
parent 7429d960d2
commit 992da4d0f5

View File

@@ -0,0 +1,54 @@
# 삼각 그래프
import sys
input = sys.stdin.readline
def solution():
t = 1
while 1:
n = int(input().rstrip())
if n == 0:
break
g = [[] for _ in range(n)]
for i in range(n):
g[i] = list(map(int, input().rstrip().split()))
dp = [[float('inf') for _ in range(3)] for _ in range(n)]
dp[0][:2] = g[0][:2]
dp[0][2] = dp[0][1]+g[0][2]
for i in range(1, n):
for j in range(3):
if i == 1:
if j == 0:
dp[i][j] = dp[i-1][1]+g[i][j]
else:
dp[i][j] = min(dp[i][j-1], min(dp[i-1][1:]))+g[i][j]
else:
if j == 0:
dp[i][j] = min(dp[i-1][0], dp[i-1][1])+g[i][j]
elif j == 1:
dp[i][j] = min(dp[i][0], min(dp[i-1]))+g[i][j]
else:
dp[i][j] = min(dp[i][1], dp[i-1][j-1], dp[i-1][j])+g[i][j]
print(f'{t}. {dp[n-1][1]}')
t += 1
return
solution()
"""
걸린 시간: 30분
시간 복잡도: n*3 테이블을 모두 채우는 것이기 때문에 O(3n)이다.
해설: 1149번(RGB 집 칠하기) 문제처럼 현재 보는 수까지 오는 최적을 계속 계산하면 된다.
조금 다른 점은 분기 조건이 다르다는 점인데, 오른쪽, 아래, 오른쪽 아래, 왼쪽 아래, 이렇게 총 4가지 방향으로 이동할 수 있다.
따라서 이것에 맞게 최소값을 찾아와야 하고, 1,2,3열에 따라 올 수 있는 곳이 다르기 때문에 잘 지정해서 해야한다.
또한 시작인 [0][1]이라는 점에 의해서 0,1 행의 노드들은 특수성이 있기 때문에 이 부분들은 직접 체크하고 반복문을 돌리는 것이 낫다.
"""