Coding Problem/DP

[BOJ 1149] RGB거리

Yepchani 2025. 2. 16. 20:00
반응형

문제

RGB거리

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

 

 

풀이

설명

모든 집을 칠하는 비용의 최솟값을 구하는 문제입니다.

 

규칙은 다음과 같습니다.

  • 집은 빨강, 초록, 파랑 중 하나의 색으로 칠해야 합니다.
  • 1번 집의 색은 2번 집의 색과 같지 않아야 합니다.
  • N번 집의 색은 N-1번 집의 색과 같지 않아야 합니다.
  • i(2 ≤ i ≤ N-1)번 집의 색은 i-1번, i+1번 집의 색과 같지 않아야 합니다.

 

DP를 이용해 해결할 수 있습니다.

 

dp[i][j]는 i번째 집까지 색칠을 마쳤고, i번째 집을 j색으로 칠했을 때의 비용의 최솟값입니다.

 

i번째 집을 j색으로 칠했을 때의 최솟값은 (i - 1번째 집을 j가 아닌 색으로 칠했을 때의 최솟값) + (i번째 집을 j색으로 칠했을 때의 최솟값)입니다.

 

0번이 r, 1번이 g, 2번이 b라고 할 때, 점화식은 다음과 같습니다.

dp[i][0] = Math.min(dp[i - 1][1], dp[i - 1][2]) + r;
dp[i][1] = Math.min(dp[i - 1][0], dp[i - 1][2]) + g;
dp[i][2] = Math.min(dp[i - 1][0], dp[i - 1][1]) + b;

 

예시 코드

function solution() {
  const N = Number(input());
  const costs = Array.from({ length: N }, () => input().split(" ").map(Number));
  const dp = Array.from({ length: N + 1 }, () => Array(3).fill(Infinity));
  dp[0] = [0, 0, 0];

  for (let i = 1; i <= N; i++) {
    const [r, g, b] = costs[i - 1];
    dp[i][0] = Math.min(dp[i - 1][1], dp[i - 1][2]) + r;
    dp[i][1] = Math.min(dp[i - 1][0], dp[i - 1][2]) + g;
    dp[i][2] = Math.min(dp[i - 1][0], dp[i - 1][1]) + b;
  }

  return Math.min(...dp[N]);
}

'Coding Problem > DP' 카테고리의 다른 글

[BOJ 2579] 계단 오르기  (0) 2025.02.28
[BOJ 17404] RGB거리 2  (0) 2025.02.17
[BOJ 1446] 지름길  (0) 2025.02.15
[BOJ 11727] 2 x n 타일링 2  (0) 2025.02.14
[BOJ 9084] 동전  (0) 2025.02.10