-
#백준 1149번 #파이썬 #문제풀이Algorithm 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]))
'Algorithm' 카테고리의 다른 글
[Python] List Comprehension to Dict (0) 2021.08.21 5 Simple Steps for Solving Any Recursive Problem (0) 2021.05.13 #백준 1463번 #파이썬 #알고리즘 #문이과통합중 (0) 2021.05.12 #백준 2579번 #파이썬 #알고리즘 #문이과통합중 (0) 2021.05.11 #백준 1904번 #파이썬 #문제풀이 (1) 2021.05.07