[BOJ-Code] 1149 - RGB거리

Posted by DHniyeo Blog on September 2, 2024

문제 링크

💡 다이나믹 프로그래밍

Memory 2044KB Time 0ms Code Length 747B

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
using namespace std;

int N;
int map[1000][3]; // 집을 색칠하는데 드는 비용
int dp[1000][3];
int result = 1e9;
void init() {
	cin >> N;
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < 3; j++) {
			cin >> map[i][j];
		}
	}
}
void solved() {
	for (int i = 0; i < 3; i++) {
		dp[0][i] = map[0][i];
	}
	for (int i = 1; i < N; i++) {
		for (int j = 0; j < 3; j++) {
			int minV = 1e9;
			for (int k = 0; k < 3; k++) {
				if (k == j) continue;
				int tmp = map[i][j] + dp[i - 1][k];
				minV = minV > tmp ? tmp : minV;
			}
			dp[i][j] = minV; // 최솟값적용
		}
	}
	for (int i = 0; i < 3; i++) {
		result = result > dp[N - 1][i] ? dp[N - 1][i] : result;
	}
}
int main() {
	init();
	solved();
	cout << result;
}

이 코드는 N개의 집을 색칠하는데 드는 비용을 계산하는 프로그램이다. init 함수에서는 N과 각 집을 색칠하는데 드는 비용을 입력받고, solved 함수에서는 각 집을 색칠할 때 이전 집의 색과 겹치지 않도록 최소 비용을 계산한다. 이를 위해 dp 배열을 사용하여 이전 집까지의 최소 비용을 저장하고, 현재 집을 색칠할 때 최소 비용을 계산하여 dp 배열을 업데이트한다. 마지막으로 모든 집을 색칠한 후의 최소 비용을 result에 저장하고 출력한다.