백준 1149번 - RGB 거리

RGB 거리 문제 바로 가기

풀이 날짜: 2026-01-11

baekjoon 알고리즘 문제 풀이

풀이 코드


import sys
input = sys.stdin.readline

n = int(input())
color = [list(map(int, input().split())) for _ in range(n)]

dp = [[0]*3 for _ in range(n)]
dp[0] = color[0]

for i in range(1, n):
    dp[i][0] = color[i][0] + min(dp[i-1][1], dp[i-1][2])
    dp[i][1] = color[i][1] + min(dp[i-1][0], dp[i-1][2])
    dp[i][2] = color[i][2] + min(dp[i-1][0], dp[i-1][1])
print(min(dp[n-1]))
  

문제 이해의 어려

RGB 거리 문제를 처음 봤을 때, 가장 헷갈렸던 점은 “집이 여러 개 있고, 색도 3개나 되는데 이걸 어떻게 관리하지?”라는 생각이었다. 특히 각 집마다 비용이 다르고, 앞집과 같은 색을 쓰면 안 된다는 조건 때문에 단순히 가장 싼 색을 고르는 방식(그리디)이 아니라는 점에서 혼란이 컸다.

이 문제는 앞에서 어떤 선택을 했는지가 뒤 선택에 영향을 주는 구조였고, 이 시점에서 “아, 이건 DP구나”라는 감이 왔다.


왜 그리디로 풀 수 없는 문제인가

처음에는 “각 집에서 가장 싼 색을 고르면 되지 않나?” 라는 생각이 들었지만, 곧 문제가 있다는 걸 깨달았다.

앞 집에서 가장 싼 색을 골라버리면, 다음 집에서 선택 가능한 색이 제한되고 결과적으로 전체 비용이 더 커질 수 있다.

즉, 현재의 최선 선택이 전체 최적해를 보장하지 않는다.
이런 구조는 전형적인 동적 계획법(DP) 문제의 특징이다.


DP 정의

i번째 집을 j색(R/G/B)으로 칠했을 때, 0번 집부터 i번 집까지의 최소 비용

예를 들어, i번째 집을 빨강(0)으로 칠한다고 가정하면:

  • i-1)번째 집은 초록(1) 또는 파랑(2)만 가능
  • 따라서 점화식은 dp[i][0] = color[i][0] + min(dp[i-1][1], dp[i-1][2]) 이렇게 구성이 된다.
  • 즉, 핵심은 현재 색을 제외한 이전 집의 두 색 중 최소값을 더하는 것이다.

헷갈렸던 점 정리

dp[0] = color[0] 을 왜 설정하는가

이 부분은 DP에서 가장 중요한 기저 조건이다.

첫 번째 집은:

  • 이전 집이 없고
  • 색 제한도 없기 때문에

각 색을 선택했을 때의 최소 비용은 그냥 자기 자신의 비용이 된다.