[백준] 1149 RGB 거리

J. Hwang·2025년 3월 20일
0

coding test

목록 보기
107/108

문제

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


출력

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


내 풀이

import sys
input = sys.stdin.readline

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

dp = [[0]*3 for _ in range(n+1)]   # 0 = R / 1 = G / 2 = B

dp[0][0] = cost[0][0]
dp[0][1] = cost[0][1]
dp[0][2] = cost[0][2]

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

print(min(dp[n-1]))
  • 시간 복잡도 → O(N)O(N)
    \because for문 n번 반복
  • 공간 복잡도 → O(N)O(N)
    \because 2차원 dp 배열이지만 각 요소 내의 요소가 3개

코멘트

규칙이 어려워보이지만, 사실상 바로 이웃한 집과 색깔이 겹치지만 않으면 되는 것이다. 쉬운 계단 수 문제처럼 2차원 배열을 사용하면 되는데, dp[i][j]를 "i번째 집을 j색으로 칠했을 때 최소 비용" 이라고 정의하면 된다. 이 때 j = 0 → R, j = 1 → G, j = 2 → B로 두고, i번째 집을 빨간색으로 칠했을 때 최소 비용은 그 i-1번째 집을 초록색, 파란색 중에 더 적은 비용이 드는 색으로 골랐을 때의 비용 + i번째 집을 빨간색으로 칠했을 때의 비용이므로 점화식을 이에 맞게 세우고, 맨 마지막 집에서 최소 비용을 고르면 된다.


References

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

profile
Let it code

0개의 댓글