알고리즘 문제풀이/Dynamic programming

백준 1149 파이썬(DP)

Aytekin 2021. 10. 11. 23:10

https://www.acmicpc.net/problem/1149

 

1149번: RGB거리

첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 1번 집부터 한 줄에 하나씩 주어진다. 집을 칠하는 비용은 1,000보다 작거나

www.acmicpc.net

DP문제를 계속해서 풀면서 느끼는점은

결국 점화식을 생각해내는 것이 핵심 포인트인것 같다.

문제를 어떻게 쪼개고 반복해서 연산한다음 합칠것인지 충분히 고민하고 문제를 푸는게 오히려 더 빠르고 정확하다는 생각이 든다.

 

  • 점화식

i번째에 빨강을 칠할 때 최소값 = i번째 빨강의 비용 + min(i-1번째 파랑의 최소값, i-1번째 초록의 최소값)

 

  • 코드
# 1149 - RGB거리 
# i 번째 빨강의 최소값 = i번째 빨강의 비용 + min(i-1번째 파랑의 최소값, i-1번째 초록의 최소값)
# 이런 아이디어이다. 결국 dp를 이용한 점화식을 생각해내는것이 중요 포인트이다.

import sys
input = sys.stdin.readline

t = int(input())
rgb = []
for _ in range(t):
    rgb.append(list(map(int,input().split())))

rgb_min = [[0,0,0] for _ in range(t)]

# rgb_min리스트의 초기값 설정
rgb_min[0][0] = rgb[0][0] # 첫번째 빨강 비용
rgb_min[0][1] = rgb[0][1] # 첫번째 초록 비용
rgb_min[0][2] = rgb[0][2] # 첫번째 파랑 비용


for i in range(1,t):
    rgb_min[i][0] = rgb[i][0] + min(rgb_min[i-1][1], rgb_min[i-1][2]) #i번째 빨강을 칠할때 최소값
    rgb_min[i][1] = rgb[i][1] + min(rgb_min[i-1][0], rgb_min[i-1][2]) #i번째 초록을 칠할때 최소값
    rgb_min[i][2] = rgb[i][2] + min(rgb_min[i-1][0], rgb_min[i-1][1]) #i번째 파랑을 칠할때 최소값

print(min(rgb_min[t-1]))

 

 

728x90

'알고리즘 문제풀이 > Dynamic programming' 카테고리의 다른 글

백준 2579 파이썬(DP)  (0) 2021.10.13
백준 1932 파이썬(DP)  (0) 2021.10.12
백준 9416 파이썬(DP)  (0) 2021.10.10
백준 1904 파이썬(DP)  (0) 2021.10.10
백준 9184 파이썬(DP - 메모이제이션)  (0) 2021.10.09