https://www.acmicpc.net/problem/1149
🗒️파이썬 코드 풀이
N = int(input())
graph = []
dp = []
for _ in range(N):
graph.append(list(map(int,input().split())))
dp.append([0]*3)
dp[0] = graph[0]
for k in range(1,N):
dp[k][0] = min(dp[k-1][1]+graph[k][0],dp[k-1][2]+graph[k][0])
dp[k][1] = min(dp[k-1][0]+graph[k][1],dp[k-1][2]+graph[k][1])
dp[k][2] = min(dp[k-1][0]+graph[k][2],dp[k-1][1]+graph[k][2])
print(min(dp[-1]))
1. 처음 문제를 보고 바로 DP라 생각 할 수는 없고,
출력 값들을 계산하다보면 DP로 풀어야 겠다는 생각이 든다.2. 첫 줄의 값들이 둘째 줄에 이어지고, 둘째 줄은 셋째 줄에 연결된다.그러니 DP로 풀어야 겠다는 생각을 한다.
3. 가장 먼저 DP 리스트와, graph 리스트를 만들어준다.
4. DP는 어떻게 점화식을 만들지를 생각하면 된다. N번째 줄은 N-1번 째 줄에 바로 영향을 받으니, 이점을 염두한다.
5. N번째 줄의 graph 값은 이전 DP 값 중 다른 색에 영향을 받고, 2가지 다른 색 중에 최소값을 선택한다.
6. 마지막 줄에 최소 값을 선택하면 원하는 답을 얻는다.
📌 문제 코멘트
문제 처음 봤을 때, 이해도 잘 안됐다.그리고 이거를 어떻게 구현하지 했는데, 하나 하나 손으로 풀이하다보니 길이 보였다.
DP는 어렵게 보이는데, 막상 풀이를 보면,생각보다 할 만 하니 차근 차근 풀이해서 점화식을 찾아보자.
📚문제
RGB거리에는 집이 N개 있다. 거리는 선분으로 나타낼 수 있고, 1번 집부터 N번 집이 순서대로 있다.
집은 빨강, 초록, 파랑 중 하나의 색으로 칠해야 한다. 각각의 집을 빨강, 초록, 파랑으로 칠하는 비용이 주어졌을 때, 아래 규칙을 만족하면서 모든 집을 칠하는 비용의 최솟값을 구해보자.
- 1번 집의 색은 2번 집의 색과 같지 않아야 한다.
- N번 집의 색은 N-1번 집의 색과 같지 않아야 한다.
- i(2 ≤ i ≤ N-1)번 집의 색은 i-1번, i+1번 집의 색과 같지 않아야 한다.
입력
첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 1번 집부터 한 줄에 하나씩 주어진다. 집을 칠하는 비용은 1,000보다 작거나 같은 자연수이다.
출력
첫째 줄에 모든 집을 칠하는 비용의 최솟값을 출력한다.
예제 입력 1 복사
3
26 40 83
49 60 57
13 89 99
예제 출력 1 복사
96
예제 입력 2 복사
3
1 100 100
100 1 100
100 100 1
예제 출력 2 복사
3
예제 입력 3 복사
3
1 100 100
100 100 100
1 100 100
예제 출력 3 복사
102
예제 입력 4 복사
6
30 19 5
64 77 64
15 19 97
4 71 57
90 86 84
93 32 91
예제 출력 4 복사
208
예제 입력 5 복사
8
71 39 44
32 83 55
51 37 63
89 29 100
83 58 11
65 13 15
47 25 29
60 66 19
예제 출력 5 복사
253
'알고리즘 > 알고리즘_백준' 카테고리의 다른 글
[Python][백준] 1193. 분수찾기 / 구현 (S5) (0) | 2024.08.13 |
---|---|
[Python][백준] 1149. 소수&팰린드롬 / 브루트포스, 에라토스테네스의 체 (S1) (0) | 2024.08.12 |
[Python][백준] 1259. 팰린드롬수 / 구현,문자열 (B1) (0) | 2024.08.11 |
[Python][백준] 1987. 알파벳 / 백트래킹,DFS (G4) (0) | 2024.08.11 |
[Python][백준] 2661. 좋은수열 / 백트래킹 (G4) (0) | 2024.08.10 |