BOJ Code/Gold

[백준/BOJ] gold4 - 17404번 RGB거리 2 (Python)

NIMHO 2024. 8. 31. 19:05
728x90

▶17404 - RGB거리 2

백준 로고

 

문제

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보다 작거나 같은 자연수이다.

 

출력

첫째 줄에 모든 집을 칠하는 비용의 최솟값을 출력한다.

728x90

풀이

dp를 할 줄 안다면 해당 문제도 쉽게 풀 수 있을 거다.

첫 번째 집이 어떤 색을 선택하는지를 먼저 골라주면 되고, 그다음부터는 일반적인 dp랑 동일하다.

대신 RGB각각 한 번씩 선택해서 최솟값을 해야 하기에, dp를 3번 돌려주면 된다.

n = int(input())
arr = []
answer = 99999

for i in range(n):
    arr.append(list(map(int, input().split())))

for i in range(3):
    dp = [[9999, 9999, 9999] for _ in range(n)]
    dp[0][i] = arr[0][i]
    
    for j in range(1, n):
        dp[j][0] = arr[j][0] + min(dp[j - 1][1], dp[j - 1][2])
        dp[j][1] = arr[j][1] + min(dp[j - 1][0], dp[j - 1][2])
        dp[j][2] = arr[j][2] + min(dp[j - 1][0], dp[j - 1][1])

    for j in range(3):
        if i != j:
            answer = min(answer, dp[-1][j])

print(answer)
728x90