From 992da4d0f5c066671e44f1d32cd6417952b9a287 Mon Sep 17 00:00:00 2001 From: sm4640 Date: Mon, 30 Mar 2026 12:00:23 +0900 Subject: [PATCH] =?UTF-8?q?4883-s1=20=EC=84=B1=EA=B3=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- workbook_7319/silver/4883-s1.py | 54 +++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 workbook_7319/silver/4883-s1.py diff --git a/workbook_7319/silver/4883-s1.py b/workbook_7319/silver/4883-s1.py new file mode 100644 index 0000000..e29ed59 --- /dev/null +++ b/workbook_7319/silver/4883-s1.py @@ -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 행의 노드들은 특수성이 있기 때문에 이 부분들은 직접 체크하고 반복문을 돌리는 것이 낫다. +""" \ No newline at end of file