[Silver I] Title: RGB거리, Time: 52 ms, Memory: 33432 KB -BaekjoonHub

This commit is contained in:
SSUM
2025-03-04 21:17:03 +09:00
parent 3ca3084444
commit 2fd00f7cdf
2 changed files with 57 additions and 0 deletions

View File

@@ -0,0 +1,36 @@
# [Silver I] RGB거리 - 1149
[문제 링크](https://www.acmicpc.net/problem/1149)
### 성능 요약
메모리: 33432 KB, 시간: 52 ms
### 분류
다이나믹 프로그래밍
### 제출 일자
2025년 3월 4일 21:16:47
### 문제 설명
<p>RGB거리에는 집이 N개 있다. 거리는 선분으로 나타낼 수 있고, 1번 집부터 N번 집이 순서대로 있다.</p>
<p>집은 빨강, 초록, 파랑 중 하나의 색으로 칠해야 한다. 각각의 집을 빨강, 초록, 파랑으로 칠하는 비용이 주어졌을 때, 아래 규칙을 만족하면서 모든 집을 칠하는 비용의 최솟값을 구해보자.</p>
<ul>
<li>1번 집의 색은 2번 집의 색과 같지 않아야 한다.</li>
<li>N번 집의 색은 N-1번 집의 색과 같지 않아야 한다.</li>
<li>i(2 ≤ i ≤ N-1)번 집의 색은 i-1번, i+1번 집의 색과 같지 않아야 한다.</li>
</ul>
### 입력
<p>첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 1번 집부터 한 줄에 하나씩 주어진다. 집을 칠하는 비용은 1,000보다 작거나 같은 자연수이다.</p>
### 출력
<p>첫째 줄에 모든 집을 칠하는 비용의 최솟값을 출력한다.</p>

View File

@@ -0,0 +1,21 @@
import sys
input = sys.stdin.readline
N = int(input())
a = []
for i in range(N):
a.append(list(map(int, input().split())))
DP_table = [[0 for _ in range(3)] for _ in range(N+1)]
DP_table[0][0] = a[0][0]
DP_table[0][1] = a[0][1]
DP_table[0][2] = a[0][2]
for i in range(1, N):
for j in range(3):
DP_table[i][j] = min(DP_table[i-1][(j+1)%3], DP_table[i-1][(j+2)%3]) + a[i][j]
print(min(DP_table[N-1][0],DP_table[N-1][1],DP_table[N-1][2]))