From 5d300435a50da214aaac2248657386a5adc5e417 Mon Sep 17 00:00:00 2001 From: sm4640 Date: Sun, 29 Mar 2026 00:52:06 +0900 Subject: [PATCH] =?UTF-8?q?1149-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/1149-s1.py | 39 +++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 workbook_7319/silver/1149-s1.py diff --git a/workbook_7319/silver/1149-s1.py b/workbook_7319/silver/1149-s1.py new file mode 100644 index 0000000..101a1fa --- /dev/null +++ b/workbook_7319/silver/1149-s1.py @@ -0,0 +1,39 @@ +# 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가지 색깔에 대해 그 전에 왔던 최선의 길을 계속 보장하는 것이다. +""" \ No newline at end of file