https://www.acmicpc.net/problem/17404
17404번: RGB거리 2
첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 1번 집부터 한 줄에 하나씩 주어진다. 집을 칠하는 비용은 1,000보다 작거나
www.acmicpc.net
백준 - RGB거리 2 (17404번)
난이도 : Gold 4
알고리즘 : Dynamic Programming
풀이 소요 시간 : 60분
import sys
input = sys.stdin.readline
def main(N):
INF = (N+1) * 1000
R, G, B = map(int, input().split())
R2, G2, B2 = map(int, input().split())
rr = gg = bb = INF
rb, rg, gr, gb, br, bg =\
R+B2, R+G2, G+R2, G+B2, B+R2, B+G2
for _ in range(N-2):
R, G, B = map(int, input().split())
rr, rg, rb, gr, gg, gb, br, bg, bb =\
min(rg, rb) + R, min(rr, rb) + G, min(rr, rg) + B,\
min(gg, gb) + R, min(gr, gb) + G, min(gr, gg) + B,\
min(bg, bb) + R, min(br, bb) + G, min(br, bg) + B
return min(rg, rb, gr, gb, br, bg)
if __name__ == '__main__':
lowest_cost = main(int(input()))
print(lowest_cost)
DP를 활용해서 푸는 문제였다.
총 N개의 집에서, x번째 집의 색을 칠할 때,총 9가지 상태가 존재하는데
R~~~~R
R~~~~G
R~~~~B
G~~~~R
G~~~~G
G~~~~B
B~~~~R
B~~~~G
B~~~~B
이렇게 9가지다.
예를 들어
1. R(GBG)R + G
2. R(BRG)B + G
이렇게 2가지 경우의 수가 있다고 할 때,
두 경우 모두 처음 집은 R, 현재 집은 G로 색칠돼있다.
결국 두 경우 중 비용이 작은 최솟값 하나만, R~~~G 섹션에 저장해두면 된다.
이렇게 DP를 활용하면, O(N)의 시간복잡도로 문제를 해결할 수 있다.
예전에 이미 풀었던 문제였는데,
너무 오랜만에 다시 풀다보니 DFS + DP로 접근하다가 시간 초과가 발생했다.
그리고 다시 위처럼 DP만 활용해서 해결했다.
'Algorithm' 카테고리의 다른 글
양과 늑대 (92243번) - 프로그래머스 (Programmers) (0) | 2023.04.26 |
---|---|
요격 시스템 (181188번) - 프로그래머스 (Programmers) (0) | 2023.04.24 |
마법사 상어와 비바라기 (21610번) - 백준 (BOJ) (0) | 2023.04.24 |
이차원 배열과 연산 (17140번) - 백준 (BOJ) (0) | 2023.04.24 |
동전 1 (2293번) - 백준 (BOJ) (0) | 2023.04.24 |