꾸준하게 거북이처럼
백준 1149번 파이썬 본문
1149번: RGB거리
첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 1번 집부터 한 줄에 하나씩 주어진다. 집을 칠하는 비용은 1,000보다 작거나
www.acmicpc.net
이번달까지는 dp만 풀 것 같다. 오늘은 가야할 곳이 있어서 바쁜 나머지,, 잠도 요즘 덜자고? 맘도 급했고 문제가 잘 풀리지 않았다.ㅠ
dp인것은 대충 감이 오지만, dp는 지금까지 백준에서는 1 또는 2차원 배열을 이용해서 차곡차곡 이전의 요구사항에 맞게 정답을 만들어 나갔다. 예를들어 최솟값을 찾는 거라면, n이 될 때까지, 점화식을 이용해서 1 ~ n 까지 차례대로 차곡차곡 이전의 값을 이용해서 n일때의 최솟값을 만들어 나가는 느낌이다.
이 문제도 그렇다.! 배열을 최대한 이용하는 것이 시간 효율이 좋다.
코드
n = int(input())
dp = []
for i in range(n):
dp.append(list(map(int,input().split())))
for i in range(1, n):
dp[i][0] = dp[i][0] + min(dp[i - 1][1], dp[i - 1][2])
dp[i][1] = dp[i][1] + min(dp[i - 1][0], dp[i - 1][2])
dp[i][2] = dp[i][2] + min(dp[i - 1][0], dp[i - 1][1])
print(min(dp[n-1][0],dp[n-1][1],dp[n-1][2]))
풀이
문제의 조건을 인지하고 난 뒤,
예시로 n이 2인 아래와 같은 경우를 보자
dp[i][0] => 빨강 | dp[i][1] => 초록 | dp[i][2] => 파랑 | |
dp[0] | 1 | 1 | 100 |
dp[1] | 2 | 5 | 100 |
이때, 우리는 최소 비용이 중복될 수 있다는 것을 알 수 있는데, 이 중복된 색을 어떤 것을 선택하느냐 그 뒤의 색들을 선택해서 최솟값이 결정된다. for문 3번 돌리지 말고, 배열의 index 기능을 활용하자.
// 2 번째 집이 빨강색을 선택했을 때, 이 때 까지의 최소비용
dp[1][0] = dp[1][0] + min(dp[1][1] , dp[1][2]) => 여기서 min은 이전 집에서 칠한 색 제외한 색 중 비용이 적은 것 고르는 과정.
// 초록색 선택 일때 최소비용
dp[1][1] = dp[1][1] + min(dp[1][0] , dp[1][2])
// 파란색 선택 일때 최소비용
dp[1][2] = dp[1][2] + min(dp[1][0] , dp[1][1])
이런식으로 n까지 dp에 값을 저장해나가서 dp[n-1] 의 값들 중 min 인 값이 정답이 되는 것이다.
참고자료
[백준] 1149번(python 파이썬)
문제 링크: https://www.acmicpc.net/problem/1149 1149번: RGB거리 RGB거리에 사는 사람들은 집을 빨강, 초록, 파랑중에 하나로 칠하려고 한다. 또한, 그들은 모든 이웃은 같은 색으로 칠할 수 없다는 규칙도
pacific-ocean.tistory.com
'Algorithm 문제 & 공부 > DP' 카테고리의 다른 글
백준 2156번 - 파이썬 (1) | 2022.08.21 |
---|---|
백준 1309 파이썬 (0) | 2022.08.18 |
백준 2225번 - 파이썬 (0) | 2022.08.15 |
백준 1699번 파이썬: 제곱수의 합 (0) | 2022.08.14 |
백준 11053번 파이썬 (0) | 2022.08.11 |