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
'BOJ Code > Gold' 카테고리의 다른 글
[백준/BOJ] gold4 - 17298번 오큰수 (0) | 2024.10.05 |
---|---|
[백준/BOJ] gold5 - 20444번 색종이와 가위 (0) | 2024.09.21 |
[백준/BOJ] gold1 - 11505번 구간 곱 구하기 (Python) (2) | 2023.10.01 |
[백준/BOJ] gold1 - 10868번 최솟값 (Python) (1) | 2023.09.30 |
[백준/BOJ] gold1 - 2357번 최솟값과 최댓값 (Python) (0) | 2023.09.28 |