문제
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보다 작거나 같은 자연수이다.
출력
첫째 줄에 모든 집을 칠하는 비용의 최솟값을 출력한다.
예제 입력 1
3
26 40 83
49 60 57
13 89 99
예제 출력 1
96
풀이
n = int(input())
color_cost = []
for _ in range(n):
color_cost.append(list(map(int, input().split())))
for i in range(1, n):
color_cost[i][0] = min(color_cost[i-1][1], color_cost[i-1][2]) + color_cost[i][0]
color_cost[i][1] = min(color_cost[i-1][0], color_cost[i-1][2]) + color_cost[i][1]
color_cost[i][2] = min(color_cost[i-1][0], color_cost[i-1][1]) + color_cost[i][2]
print(min(color_cost[-1]))
각각의 경우에 대한 최솟값을 구해주는 dp형식으로 구현했다.
0번 = Red
1번 = Green
2번 = Blue
즉, 위의 코드에 예시를 적용해보면
- i가 1일 때
- color_cost[1][0] : 1번째 집을 Red로 칠하는 경우
- 0번째 집을 나머지 경우인 Green과 Blue로 칠하는 비용중 작은 것과 1번째 집을 Red로 칠하는 비용을 더하여 저장
- color_cost[1][0] : 1번째 집을 Red로 칠하는 경우
이런식으로 점화식을 거쳐서 맨 마지막 원소에 3가지 경우에대한 비용의 합이 들어간다.
우리는 최소값을 구해야하므로 제일 작은 원소 도출
반응형
'Algorithm > Online judge' 카테고리의 다른 글
[백준] 2407번 > 조합 (0) | 2021.03.09 |
---|---|
[백준] 12865번 > 평범한 배낭 (0) | 2021.03.09 |
[백준] 9020번 > 골드바흐의 추측 (0) | 2021.03.09 |
[백준] 1011번 > Fly me to the Alpha Centauri (0) | 2021.03.09 |
[백준] 4358번 > 생태학 (0) | 2021.03.07 |