PS/Baekjoon Online Judge

[백준 01149] RGB거리 [C/C++]

kimyoungrok 2024. 7. 20. 21:46
728x90

문제

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

출력

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


풀이

결국 이전에 선택한 색상만 안고르면 되는 문제다.

dp[i][color] = i 번째 집에서 집을 color로 칠할때 현재까지의 최소 비용

만약 현재 빨강색으로 집을 칠한다고 하면 i - 1번째 집을 색칠한 최소 비용 중 초록과 파랑의 비용과 합산해야 한다.

문제에서 주어진 조건에 따라 이전 집의 색상이 현재 칠하는 색상과 달라야 하기 때문이다.

사실 dp[i - 1]의 값은 dp[i]를 계산하고나서 쓸모가 없다. 토글링을 해주면 변수 r, g, b와 dp[3], prev[3]칸으로도 충분하다.


소스코드

보기


출처

https://www.acmicpc.net/problem/1149

728x90