코딩복습장
[백준] 1149번(python 파이썬) - RGB거리 본문
728x90
문제 링크: https://www.acmicpc.net/problem/1149
시간 제한 | 메모리 제한 | 제출 | 정답 | 맞힌사람 | 정답비율 |
0.5 초 (추가 시간 없음) | 128 MB | 91353 | 48823 | 36446 | 52.814% |
문제
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보다 작거나 같은 자연수이다.
출력
첫째 줄에 모든 집을 칠하는 비용의 최솟값을 출력한다.
풀이
이 문제는 dp문제 유형이다.
경우의 수는 3가지가 존재한다.
빨강을 선택, 초록을 선택, 파랑을 선택
입력이 다음과 같은 경우를 생각해보자.
2
4 5 6
1 2 3
첫번째 열에 있는 수 중에서 빨강이 가장 작은 비용을 가지고 있다.
-> 첫번쨰 줄만을 고려하면 빨강을 선택하는 것이 최소비용이다.
하지만 두번째 줄까지 고려한다면 빨강을 선택하는 것은 최소비용이 될 수 없다. (같은 색상 선택불가)
- 첫번째 줄과 두번째 줄을 모두 고려해야 한다.
- 첫번째 줄에서 각각의 색상을 선택할 경우 두번째 줄까지 계산한 최솟값들을 모두 구한다.(누적 최솟값)
- 이렇게 누적 최솟값들은 두번쨰 줄에서 각각의 색상을 선택한 값과 같아진다고 생각할 수 있다.
(최솟값이기 때문에 두번째 줄 이전 줄을 생각할 필요가 없음)
이 과정을 정리한다면 다음과 같다.
0: 빨강, 1: 초록, 2: 파랑
i: 현재 계산하는 줄
arr: 색상의 선택비용이 들어있는 list
점화식
arr[i][0] = min(arr[i-1][1], arr[i-1][2]) + arr[i][0] (i번째 줄에서 빨강을 선택하는 경우의 최솟값)
이 점화식을 이용해서 각각의 색깔을 선택하는 경우의 최솟값을 구한 후 그 중에서 최솟값을 찾으면 된다.
구현코드
n = int(input())
arr = []
for _ in range(n):
arr.append(list(map(int, input().split())))
for i in range(1, n):
arr[i][0] = min(arr[i-1][1], arr[i-1][2]) + arr[i][0]
arr[i][1] = min(arr[i-1][0], arr[i-1][2]) + arr[i][1]
arr[i][2] = min(arr[i-1][0], arr[i-1][1]) + arr[i][2]
print(min(arr[n-1]))
728x90
'코딩 테스트 > python(파이썬)' 카테고리의 다른 글
[백준] 7576번(python 파이썬) - 토마토 (0) | 2023.02.10 |
---|---|
[백준] 2578번(python 파이썬) - 빙고 (0) | 2023.02.10 |
[백준] 1541번(python 파이썬) - 잃어버린 괄호 (0) | 2023.02.10 |
[백준] 11724번(python 파이썬) - 연결 요소의 개수 (0) | 2023.02.10 |
[백준] 1991번(python 파이썬) - 트리순회 (0) | 2023.02.10 |
Comments