반응형
RGB거리 2
시간 제한 | 메모리 제한 | 제출 | 정답 | 맞힌 사람 | 정답 비율 |
0.5 초 (추가 시간 없음) | 128 MB | 10904 | 6318 | 5187 | 58.157% |
문제
RGB거리에는 집이 N개 있다. 거리는 선분으로 나타낼 수 있고, 1번 집부터 N번 집이 순서대로 있다.
집은 빨강, 초록, 파랑 중 하나의 색으로 칠해야 한다. 각각의 집을 빨강, 초록, 파랑으로 칠하는 비용이 주어졌을 때, 아래 규칙을 만족하면서 모든 집을 칠하는 비용의 최솟값을 구해보자.
- 1번 집의 색은 2번, N번 집의 색과 같지 않아야 한다.
- N번 집의 색은 N-1번, 1번 집의 색과 같지 않아야 한다.
- i(2 ≤ i ≤ N-1)번 집의 색은 i-1, i+1번 집의 색과 같지 않아야 한다.
입력
첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 1번 집부터 한 줄에 하나씩 주어진다. 집을 칠하는 비용은 1,000보다 작거나 같은 자연수이다.
출력
첫째 줄에 모든 집을 칠하는 비용의 최솟값을 출력한다.
예제 입력 1
3
26 40 83
49 60 57
13 89 99
예제 입력 2
3
1 100 100
100 1 100
100 100 1
예제 입력 3
3
1 100 100
100 100 100
1 100 100
예제 입력 4
6
30 19 5
64 77 64
15 19 97
4 71 57
90 86 84
93 32 91
예제 입력 5
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
예제 출력 1
110
예제 출력 2
3
예제 출력 3
201
예제 출력 4
208
예제 출력 5
253
풀이
n = int(input())
a = [(0, 0, 0)] + [tuple(map(int, input().split())) for _ in range(n)]
d = [[0] * 3 for _ in range(n + 1)]
ans = 1000 * 1000 + 1
for k in range(3): # house1's color
for j in range(3):
if j == k:
d[1][j] = a[1][j]
else:
d[1][j] = 1000 * 1000 + 1
for i in range(2, n + 1):
d[i][0] = min(d[i - 1][1], d[i - 1][2]) + a[i][0]
d[i][1] = min(d[i - 1][0], d[i - 1][2]) + a[i][1]
d[i][2] = min(d[i - 1][0], d[i - 1][1]) + a[i][2]
for j in range(3):
if j == k:
continue
ans = min(ans, d[n][j])
print(ans)
Uploaded by N2T
반응형
'Algorithm' 카테고리의 다른 글
[백준 2309 파이썬/python] 일곱 난쟁이 (1) | 2023.05.17 |
---|---|
[백준 10812 파이썬/python] 바구니 순서 바꾸기 (0) | 2023.05.17 |
[백준 2133 파이썬/python] 타일 채우기 (0) | 2023.04.28 |
[백준 13398 파이썬/python] 연속합 2 (0) | 2023.04.28 |
[백준 11054 파이썬/python] 가장 긴 바이토닉 부분 수열 (0) | 2023.04.25 |