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]))