Algorithm
#백준 1149번 #파이썬 #문제풀이
Eric_Park
2021. 5. 10. 12:39
### 문제설명
RGB거리에는 집이 N개 있다. 거리는 선분으로 나타낼 수 있고, 1번 집부터 N번 집이 순서대로 있다.
집은 빨강, 초록, 파랑 중 하나의 색으로 칠해야 한다. 각각의 집을 빨강, 초록, 파랑으로 칠하는 비용이 주어졌을 때, 아래 규칙을 만족하면서 모든 집을 칠하는 비용의 최솟값을 구해보자.
- 1번 집의 색은 2번 집의 색과 같지 않아야 한다.
- N번 집의 색은 N-1번 집의 색과 같지 않아야 한다.
- i(2 ≤ i ≤ N-1)번 집의 색은 i-1번, i+1번 집의 색과 같지 않아야 한다.
### 예제입력
3
26 40 83
49 60 57
13 89 99
### 예제출력
96
### 출력
첫째 줄에 모든 집을 칠하는 비용의 최솟값을 출력한다.
### 문제풀이 1
문제를 잘못이해하고 풀이한 내용. 각 집의 최소값이 그 전의 집의 최소값을 가르키는 인덱스만 제외하고 선택할 수 있는 방식으로 풀이하였다. 문제에서는 선택으로 인한 누적 비용을 고려해야 한다. 우연히 첫번째 케이스를 맞추고
정답제출을 하였으나 실패.
# 변수입력
n = int(input())
blank =[]
for i in range(n):
tmp = list(map(int, input().split()))
blank.append(tmp)
def A():
sum_count = 0
ban1 = 0
for k in range(len(blank)):
tmp3 = blank[k]
#print(tmp3)
#tmp3.pop(ban1)
# min
tmp_blank = []
# 특정 index 값을 제외한 나머지 값들의 최소값
if k == 0:
for t in blank[k]:
tmp_blank.append(t)
else:
for t in blank[k]:
if blank[k].index(t) == ban1:
pass
else:
tmp_blank.append(t)
tmp3_min = min(tmp_blank)
#print(tmp3_min)
sum_count += tmp3_min
# min_idx
tmp3_min_idx = tmp3.index(tmp3_min)
ban1 = tmp3_min_idx
return sum_count
result01 = A()
print(result01)
### 문제풀이 2
다른 블로그들의 문제풀이 방식.
주어진 비용들을 누적비용으로 업데이트 하는 방식을 채택.
p[n] = func( p[n-1] ) + p[n]
or
p[n] += func( p[n-1] )
방식으로 업데이트 하였다.
n = int(input())
p = []
for i in range(n):
p.append(list(map(int, input().split())))
for i in range(1, len(p)):
p[i][0] = min(p[i - 1][1], p[i - 1][2]) + p[i][0]
p[i][1] = min(p[i - 1][0], p[i - 1][2]) + p[i][1]
p[i][2] = min(p[i - 1][0], p[i - 1][1]) + p[i][2]
print(min(p[n - 1][0], p[n - 1][1], p[n - 1][2]))