[BOJ] 1149. RGB거리

2025. 7. 16. 11:41·BOJ

📌 문제 제목

문제 링크: BOJ 1149

🗒️ 문제 설명

RGB거리에는 N개의 집이 1번부터 순서대로 있다.

집은 빨강, 초록, 파랑 중 하나의 색으로 칠해야 한다. 각각의 집을 칠하는 비용이 주어졌을 때, 아래의 규칙을 만족하면서 모든 집을 칠하는 비용의 최솟값을 구하여라.

  • 1번 집의 색은 2번 집의 색과 같지 않아야 한다.
  • N번 집의 색은 N-1번 집의 색과 같지 않아야 한다.
  • i(2<= i <= N-1)번 집의 색은 i-1번, i+1번 집의 색과 같지 않아야 한다.

시간 제한: 0.5초

메모리 제한: 128MB

2 <= N <= 1,000

집을 칠하는 비용 <= 1,000


💡 문제 해결 아이디어

  • 테이블 정의
    • dp[i]는 i번째 집까지 칠할 때의 최소 비용
    • dp[i][0]은 i번째 집이 빨강
    • dp[i][1]은 i번째 집이 초록
    • dp[i][2]는 i번째 집이 파랑
  • 점화식 찾기
    • dp[1]
      • dp[1][0] = costs[0][0]
      • dp[1][1] = costs[0][1]
      • dp[1][2] = costs[0][2]
    • dp[2]
      • dp[2][0] = min(dp[1][1], dp[1][2]) + costs[1][0]
      • dp[2][1] = min(dp[1][0], dp[1][2]) + costs[1][1]
      • dp[2][2] = min(dp[1][0], dp[1][1]) + costs[1][2]
    • 점화식
      • dp[i][0] = min(dp[i-1][1], dp[i-1][2]) + costs[i-1][0]
      • dp[i][1] = min(dp[i-1][0], dp[i-1][2]) + costs[i-1][1]
      • dp[i][2] = min(dp[i-1][0], dp[i-1][1]) + costs[i-1][2]
  • 초기값 정하기
    • dp[1][0] = costs[0][0]
    • dp[1][1] = costs[0][1]
    • dp[1][2] = costs[0][2]

⌛️ 시간 복잡도

  • O(3N) -> O(N)

✅ 최종 코드

import sys
input = sys.stdin.readline

N = int(input().strip())
costs = [list(map(int, input().split())) for _ in range(N)]  # RGB 비용

dp = [[-1] * 3 for _ in range(N+1)]
dp[1][0] = costs[0][0]
dp[1][1] = costs[0][1]
dp[1][2] = costs[0][2]

for i in range(2, N+1):
    for j in range(3):
        if j == 0:
            dp[i][j] = min(dp[i-1][1], dp[i-1][2]) + costs[i-1][j]
        elif j == 1:
            dp[i][j] = min(dp[i-1][0], dp[i-1][2]) + costs[i-1][j]
        elif j == 2:
            dp[i][j] = min(dp[i-1][0], dp[i-1][1]) + costs[i-1][j]

print(min(dp[N]))

 

'BOJ' 카테고리의 다른 글

[BOJ] 1874. 스택 수열  (0) 2025.07.17
[BOJ] 11726 2xn 타일링  (0) 2025.07.16
[BOJ] 2579. 계단 오르기  (0) 2025.07.15
[BOJ] 9095. 1, 2, 3 더하기  (0) 2025.07.15
[BOJ] 1463. 1로 만들기  (0) 2025.07.15
'BOJ' 카테고리의 다른 글
  • [BOJ] 1874. 스택 수열
  • [BOJ] 11726 2xn 타일링
  • [BOJ] 2579. 계단 오르기
  • [BOJ] 9095. 1, 2, 3 더하기
rubato.dev
rubato.dev
  • rubato.dev
    rubato.dev
    rubato.dev
  • 전체
    오늘
    어제
    • 분류 전체보기 (33) N
      • BOJ (28)
      • 알고리즘 (4)
      • TIL (0)
      • Project (1) N
  • 인기 글

  • 태그

    Project
    DFS
    투 포인터
    Zelda
    stack
    Algorithm
    dp
    스택
    PYTHON
    PriorityQueue
    backtracking
    Next.js
    BFS
    BOJ
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
rubato.dev
[BOJ] 1149. RGB거리
상단으로

티스토리툴바