https://www.acmicpc.net/problem/1149
1149번: RGB거리
첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 1번 집부터 한 줄에 하나씩 주어진다. 집을 칠하는 비용은 1,000보다 작거나
www.acmicpc.net
문제
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보다 작거나 같은 자연수이다.
출력
첫째 줄에 모든 집을 칠하는 비용의 최솟값을 출력한다.
해결법
앞선 색과 겹치지 않아야한다는 규칙을 사용해 RGB별로 선택됐을 때 드는 비용을 이차원행렬 d에 저장.
현재 R값이라면 이전 행에서는 G,B중 작은 값을 선택해 현재 R값과 더하는 방식.
쉬운 이해를 위해 color행렬에 input값을 받았지만 d로 바로 받아 update 하며 바꿔가도 됨.
import sys
N = int(sys.stdin.readline())
color = []
for _ in range(N):
color.append(list(map(int,sys.stdin.readline().split())))
#처음 행으로 d행렬 초기화, d행렬= RGB 최소값을 계산하는 행렬
d=[[0]*3 for _ in range(N)]
d[0]=color[0]
for n in range(1,N):
#R을 선택했을 때
#R선택한 총 비용 = 현재 R값 + G를 선택했을 때 값과 B를 선택했을 때 값 중 작은 걸 선택
d[n][0] = color[n][0]+ min(d[n-1][1], d[n-1][2])
#G를 선택했을 때
#G선택한 총 비용 = 현재 G값 + R을 선택했을 때 값과 B를 선택했을 때 값 중 작은 걸 선택
d[n][1] = color[n][1]+ min(d[n-1][0], d[n-1][2])
#B를 선택했을 때
#B선택한 총 비용 = 현재 B값 + R을 선택했을 때 값과 G를 선택했을 때 값 중 작은 걸 선택
d[n][2] = color[n][2]+ min(d[n-1][0], d[n-1][1])
#마지막으로 3가지 색중 가장 작은 값
print(min(d[N-1][0],d[N-1][1],d[N-1][2]))
배운점
처음에 문제 이해를 잘못해서 다른 방식으로 풀었던게 아쉬움.
현재 색과 다른 색 중 작은 값으로 d배열을 update 하는 규칙을 생각하는 사고를 길렀다.
'코딩 테스트' 카테고리의 다른 글
| [백준 14501번] 퇴사 파이썬 python (1) | 2023.04.13 |
|---|---|
| [백준 12865번] 평범한 배낭 파이썬 python (0) | 2023.04.12 |
| [백준 2775번] 부녀회장이 될테야 python (0) | 2023.04.11 |
| [백준 1003번] 피보나치 수열 python (0) | 2023.04.11 |
| [백준 9095번] 1, 2, 3 더하기 python (0) | 2023.04.11 |
댓글