-
[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 함수의 결과값을 채택한다.
- 수학적 귀납법.. 예전에 고딩때 수학 문제 풀 때 뒷 회차 먼저 보고 앞 회차 식 세우는 방식 생각하면 될 듯.. 어렵다
'Solve' 카테고리의 다른 글
[BOJ/Python] 11660 - 구간 합 구하기 5 (0) 2024.08.05 [BOJ/Python] 백준 15663, 15666 - N과 M(9), (12) (0) 2024.08.05 [BOJ/Python] 백준 4963 - 섬의 개수 (0) 2024.07.22 [BOJ/Python] 백준 2644 - 촌수계산 (4) 2024.07.22 [BOJ/Python] 백준 2805 - 나무 자르기, 백준 1654 - 랜선 자르기 (0) 2024.07.15