코딩복습장

[백준] 1149번(python 파이썬) - RGB거리 본문

코딩 테스트/python(파이썬)

[백준] 1149번(python 파이썬) - RGB거리

코복장 2023. 2. 10. 17:58
728x90

문제 링크: https://www.acmicpc.net/problem/1149

 

1149번: RGB거리

첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 1번 집부터 한 줄에 하나씩 주어진다. 집을 칠하는 비용은 1,000보다 작거나

www.acmicpc.net

 

 

시간 제한 메모리 제한 제출 정답 맞힌사람 정답비율
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

첫번째 열에 있는 수 중에서 빨강이 가장 작은 비용을 가지고 있다.

-> 첫번쨰 줄만을 고려하면 빨강을 선택하는 것이 최소비용이다.

 

하지만 두번째 줄까지 고려한다면 빨강을 선택하는 것은 최소비용이 될 수 없다. (같은 색상 선택불가)

  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
Comments