Algorithm/Online judge

[백준] 1149번 > RGB거리

민철킹 2021. 3. 9. 12:32

www.acmicpc.net/problem/1149

 

1149번: RGB거리

첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 1번 집부터 한 줄에 하나씩 주어진다. 집을 칠하는 비용은 1,000보다 작거나

www.acmicpc.net

문제

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로 칠하는 비용을 더하여 저장

 

이런식으로 점화식을 거쳐서 맨 마지막 원소에 3가지 경우에대한 비용의 합이 들어간다. 

우리는 최소값을 구해야하므로 제일 작은 원소 도출

반응형