N개의 집이 일렬로 있고, 빨강, 초록, 파랑 이 세가지로 칠하는 경우 각각 집마다 색마다 비용이 주어졌다.
N은 2 이상 1000이하이고, 비용은 1000 이하 자연수이다.
이웃 집과 다른 색으로 N개의 집을 모두 색칠할 때, 비용 합산의 최솟값을 구하는 문제
문제
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보다 작거나 같은 자연수이다.
출력
첫째 줄에 모든 집을 칠하는 비용의 최솟값을 출력한다.
R, G, B로 칠하는 경우를 모두 구해서 최솟값을 출력하면 된다.
모든 경우의 수를 고려하면 시간, 메모리가 부족할 수도 있기 때문에 매번 최솟값이 드는 시나리오만 선택한다.
현재 칠하는 집을 1번 색으로 칠할 때,
이전 집을 2번, 3번 색으로 칠했을 경우 중 누적 비용이 더 적은 시나리오를 선택한다.
이 방식을 반복하면 된다.
처음에는 이전 집의 색과 다른 색으로 현재 집을 칠하려고 할 때,
다른 두 가지 색 중에서 더 저렴한 색을 선택하는 코드를 짰었는데, 위와 비슷하게 보일 수 있지만 이 경우에는
앞의 선택으로 이후에 더 큰 비용을 합산하게 되는 경우가 생길 수 있어서 적절하지 않다.
색칠할 때마다 누적합만 저장해서 문제를 푸는 코드
from sys import stdin
input = stdin.readline
def main():
N = int(input())
RGB = (0,0,0)
for _ in range(N):
r, g, b = map(int, input().split())
RGB = (r + min(RGB[1], RGB[2]),
g + min(RGB[2], RGB[0]),
b + min(RGB[0], RGB[1]))
print(min(RGB))
if __name__ == "__main__":
main()
색칠할 때마다 누적합을 리스트의 현재 인덱스에 저장하는 코드
from sys import stdin
input = stdin.readline
def main():
N = int(input())
RGB = []
for _ in range(N):
RGB.append(list(map(int, input().split())))
for i in range(1, N):
RGB[i][0] += min(RGB[i-1][1], RGB[i-1][2])
RGB[i][1] += min(RGB[i-1][2], RGB[i-1][0])
RGB[i][2] += min(RGB[i-1][0], RGB[i-1][1])
print(min(RGB[N-1]))
if __name__ == "__main__":
main()
예제 입력 1
3
26 40 83
49 60 57
13 89 99
예제 출력 1
96
예제 입력 2
3
1 100 100
100 1 100
100 100 1
예제 출력 2
3
예제 입력 3
3
1 100 100
100 100 100
1 100 100
예제 출력 3
102
예제 입력 4
6
30 19 5
64 77 64
15 19 97
4 71 57
90 86 84
93 32 91
예제 출력 4
208
예제 입력 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
예제 출력 5
253
'IT > Python' 카테고리의 다른 글
[백준] 1932번 정수 삼각형 [Python] - 다이나믹 (1) | 2023.10.23 |
---|---|
[백준] 1629번 곱셈 [Python] (1) | 2023.10.23 |
[백준] 11725번 트리의 부모 찾기 [Python] - 그래프 이론, BFS, DFS (1) | 2023.10.20 |
[백준] 7662번 이중 우선순위 큐[Python] - 자료구조 (0) | 2023.10.20 |