ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [BOJ/Python] 백준 1149 - RGB거리
    Solve 2024. 7. 22. 15:36

    문제

    더보기

    문제

    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())
    li = []
    for _ in range(n):
        li.append(list(map(int, input().split())))
    
    
    for i in range(1, n): # 1회부터 시작
        li[i][0] = min(li[i - 1][1], li[i - 1][2]) + li[i][0]
        li[i][1] = min(li[i - 1][0], li[i - 1][2]) + li[i][1]
        li[i][2] = min(li[i - 1][0], li[i - 1][1]) + li[i][2]
    
    print(min(li[n - 1][0], li[n - 1][1], li[n - 1][2]))

     

    • if 현재 빨간색을 선택한 경우(1회차), 이전 회차(ex. 초기에 주어진 집)에서 빨간색을 제외한
      파란색, 초록색 중 최저 비용을 선택한다.
    • if 현재 초록색을 선택한 경우(1회차), 이전 회차 초기 비용에서 초록색을 제외한 빨간색, 파란색 중 최저 비용을 선택한다.
    • 모든 색상에 마찬가지로 진행하고, 거꾸로 생각했을 때 현재 선택한 색상을 기준으로 그 앞 차수의 비용의 최저값을 선택한다고 생각하면 된다. i = 1, 2, .. 일때 성립하므로, i = n일 때도 성립한다.
    • 따라서, 최종 결과는 마지막 회차에서 선택한 색상을 기준으로 가장 적은 비용이 드는 DP 함수의 결과값을 채택한다.
    • 수학적 귀납법.. 예전에 고딩때 수학 문제 풀 때 뒷 회차 먼저 보고 앞 회차 식 세우는 방식 생각하면 될 듯.. 어렵다