본문 바로가기

CodingTest/Baekjun Online Judge

[ BOJ / 파이썬 ] 1149 RGB거리

import sys
input = sys.stdin.readline

n = int(input())
R = []
G = []
B = []
for i in range(n):
  r, g, b = map(int, input().split())
  R.append(r)
  G.append(g)
  B.append(b)
  
d = [[0] * 3 for _ in range(n)]
d[0][0] = R[0]
d[0][1] = G[0]
d[0][2] = B[0]

for i in range(1, n):
  d[i][0] = min(d[i-1][1], d[i-1][2]) + R[i]
  d[i][1] = min(d[i-1][0], d[i-1][2]) + G[i]
  d[i][2] = min(d[i-1][0], d[i-1][1]) + B[i]

print(min(d[n-1][0], d[n-1][1], d[n-1][2]))

 

개인적으로 이 문제에서 구현하기 까다로웠던 건 이전 d값에 따라서 현재 값에서 해당 값을 빼놓는 부분이었다.

그래서 첫 제출에서 고생 많이 하고도 틀렸다.

다른 언어로 된 해설을 보고 난 뒤 그 방식을 파이썬으로 구현한 코드인데, 값이 작으니까. 색깔별로 각 값을 다 구하는 것이다. 

그리고 이전 값에 의존해서 현재 값을 구하기 위해서는. 해당 값의 색에 대해서 이전 값의 안 겹치는 부분과 R, G, B 색을 따로 따로 저장해서 그 때 상황에 맞춰서 더해주는 방식을 사용한 것이다.

 

증말.. 멋진 생각이다.