ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • #백준 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]))
by eric