🔒 문제
RGB거리에는 집이 N개 있다. 거리는 선분으로 나타낼 수 있고, 1번 집부터 N번 집이 순서대로 있다.
집은 빨강, 초록, 파랑 중 하나의 색으로 칠해야 한다. 각각의 집을 빨강, 초록, 파랑으로 칠하는 비용이 주어졌을 때, 아래 규칙을 만족하면서 모든 집을 칠하는 비용의 최솟값을 구해보자.
- 1번 집의 색은 2번 집의 색과 같지 않아야 한다.
- N번 집의 색은 N-1번 집의 색과 같지 않아야 한다.
- i(2 ≤ i ≤ N-1)번 집의 색은 i-1번, i+1번 집의 색과 같지 않아야 한다.
⌨ 입력
첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다.
둘째 줄부터 N개의 줄에는 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 1번 집부터 한 줄에 하나씩 주어진다.
집을 칠하는 비용은 1,000보다 작거나 같은 자연수이다.
🖨 출력
첫째 줄에 모든 집을 칠하는 비용의 최솟값을 출력한다.
📚 예제
Ex1)
3
26 40 83
49 60 57
13 89 99
96
Ex2)
3
1 100 100
100 1 100
100 100 1
3
Ex3)
3
1 100 100
100 100 100
1 100 100
102
Ex4)
6
30 19 5
64 77 64
15 19 97
4 71 57
90 86 84
93 32 91
208
Ex5)
8
71 39 44
32 83 55
51 37 63
89 29 100
83 58 11
65 13 15
47 25 29
60 66 19
253
📌 풀이
dp[집의 수][RGB] 로 행렬을 만들고
dp[n][0]은 빨강일 때, dp[n][1]은 초록일 때, dp[n][2]는 파랑일 때 집을 칠하는 최소 비용이다.
dp[n][m]이 있다고 하자.
n == 1 일 때
dp[n][0] = 집 칠하는 비용[n][0]
dp[n][1] = 집 칠하는 비용[n][1]
dp[n][2] = 집 칠하는 비용[n][2]n >= 2 일 때
1) m == 0
dp[n][m] = 집 칠하는 비용[n][m]+ min(dp[n-1][1],dp[n-1][2])
2) m == 1
dp[n][m] = 집 칠하는 비용[n][m]+ min(dp[n-1][0],dp[n-1][2])
3) m == 2
dp[n][m] = 집 칠하는 비용[n][m]+ min(dp[n-1][0],dp[n-1][1])
출력할 때는 RGB 3개 중 가장 최솟값을 찾아서 출력하면 된다.
🔑 python 코드
import sys
N = int(sys.stdin.readline())
cost = [[int(x) for x in sys.stdin.readline().split()] for _ in range(N)]
dp = [[0 for _ in range(3)] for _ in range(N)]
dp[0] = cost[0]
for i in range(0,N):
for j in range(3):
if j==0:
dp[i][j] = min(dp[i-1][1],dp[i-1][2]) + cost[i][j]
elif j==1:
dp[i][j] = min(dp[i-1][0],dp[i-1][2]) + cost[i][j]
else:
dp[i][j] = min(dp[i-1][0],dp[i-1][1]) + cost[i][j]
print(min(dp[N-1]))
'BAEKJOON > 알고리즘' 카테고리의 다른 글
[BOJ] 1562번 : 계단 수 (4) | 2023.01.01 |
---|---|
[BOJ] 10844번 : 쉬운 계단 수 (0) | 2022.12.30 |
[BOJ] 1932번 : 정수 삼각형 (Python) (0) | 2022.12.30 |
[BOJ] 1463번 : 1로 만들기 (Python) (0) | 2022.12.30 |
[BOJ] 11726번 : 2xn 타일링 (Python) (1) | 2022.12.30 |