BOJ 17404 (RGB๊ฑฐ๋ฆฌ 2)
ย - Last update: 2023-06-01

๊ธฐ์กด RGB๊ฑฐ๋ฆฌ ๋ฌธ์ œ์˜ ๊ฐ•ํ™”ํŒ. ๊ทธ๋ž˜๋„ ์ตœ๊ทผ DP ์งฌ๋ฐฅ์ด ์žˆ์–ด์„œ ๊ทธ๋Ÿฐ์ง€ ์ฒ˜์Œ์— ๋ง‰ํ˜”์–ด๋„ ํžŒํŠธ ์•ˆ๋ณด๊ณ  ์ตœ์ข… ํ’€์ด์— ์„ฑ๊ณตํ–ˆ๋‹ค. ํ’€์ด ๋ฐฉ์‹์—๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ์–ด ๋ณด์ด๋Š”๋ฐ, ๋‚˜๋Š” DP ์ฐจ์›์„ ํ™•์žฅํ•˜๋Š” ๊ฒƒ์œผ๋กœ ํ•ด๊ฒฐํ–ˆ๋‹ค.

DP[sc][c][i] // ์‹œ์ž‘ color๊ฐ€ sc์ด๊ณ , i์ง€์ ์„ c๋กœ ์น ํ–ˆ์„ ๋•Œ์˜ ๋น„์šฉ ์ตœ์†Œ๊ฐ’

์ด๋ ‡๊ฒŒ ์ •์˜ํ•ด๋‘๊ณ , 1, 2๋Š” ๋ฏธ๋ฆฌ ๊ณ„์‚ฐํ•ด๋‘๊ณ  N-1๊นŒ์ง€ ์ด์ „ ์ขŒํ‘œ๋งŒ ๋ณด๋ฉด์„œ ๊ตฌํ•œ ๋‹ค์Œ์—, N ๋ฒˆ์งธ๋Š” ๊ฐ’์ด ํ™•์ •๋จ์„ ์ด์šฉํ•ด์„œ ๊ตฌํ•œ๋‹ค. (N๋ฒˆ์งธ๋Š” sc์—์„œ ์“ด ์ƒ‰๊ณผ, N-1์—์„œ ์“ด ๋‘ ์ƒ‰์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค)

๋ฌผ๋ก , 2๋ฅผ ๋ฏธ๋ฆฌ ๊ณ„์‚ฐํ•  ๋•Œ, DP[0][0][2] ๊ณผ ๊ฐ™์€ ๊ฐ’์€ ์กด์žฌํ•  ์ˆ˜ ์—†๋‹ค. ์ด๋Ÿด ๊ฒฝ์šฐ ํฐ ๊ฐ’์„ ๋„ฃ์–ด๋‘์–ด์„œ ์Šคํ‚ตํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์•ผ๊ฒ ๋‹ค. (์ตœ์ข… ๊ฒฐ๊ณผ๊ฐ€ ์ตœ์†Œ๋ฅผ ์ฐพ๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ๋ฌด์‹œ๋  ์ˆ˜ ์žˆ๋„๋ก)

๋˜, ๋‚˜์ค‘์— ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค ํ’€์ด๋ฅผ ๋ณด๋‹ˆ sc๋ฅผ ์—†์• ๊ณ , ์ „์ฒด loop์„ ์„ธ๋ฒˆ ๋Œ๋ฆฌ๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๋”๋ผ. ์ด๊ฑด ์ฐธ๊ณ .

#include <bits/stdc++.h>
using namespace std;
int DP[3][3][1001];
int main() {
int N; scanf("%d", &N);
int cost[3][1001];
for(int i = 1; i <= N; ++i) {
int r, g, b;
scanf("%d %d %d", &r, &g, &b);
cost[0][i] = r;
cost[1][i] = g;
cost[2][i] = b;
}
// DP[sc][c][i] // 1์œ„์น˜์˜ ์ƒ‰์ƒ์ด sc์ด๋ฉฐ, ์ƒ‰์ƒ c๋กœ i๋ฒˆ์งธ๋ฅผ ์น ํ–ˆ์„ ๋•Œ์˜ ๋น„์šฉ์˜ ์ตœ์†Œ๊ฐ’
DP[0][0][2] = 0x4FFFFFFF; // ๋ถˆ๊ฐ€๋Šฅํ•œ case
DP[1][1][2] = 0x4FFFFFFF;
DP[2][2][2] = 0x4FFFFFFF;
DP[0][1][2] = cost[0][1] + cost[1][2];
DP[0][2][2] = cost[0][1] + cost[2][2];
DP[1][0][2] = cost[1][1] + cost[0][2];
DP[1][2][2] = cost[1][1] + cost[2][2];
DP[2][0][2] = cost[2][1] + cost[0][2];
DP[2][1][2] = cost[2][1] + cost[1][2];
// 2~N-1๊นŒ์ง€ ๋ณด๊ณ ,
// N๋ฒˆ์งธ์˜ ๊ฒฝ์šฐ N-1๊ณผ 1์„ ๋™์‹œ์— ๋ณด๊ณ  ์„ ํƒํ•œ๋‹ค. (์‚ฌ์‹ค ์„ ํƒ์˜ ์—ฌ์ง€๊ฐ€ ์—†์Œ)
for(int sc = 0; sc < 3; ++sc) {
for(int i = 3; i <= N-1; ++i) {
for(int c = 0; c < 3; ++c) {
int v1 = cost[c][i] + DP[sc][(c+1)%3][i - 1];
int v2 = cost[c][i] + DP[sc][(c+2)%3][i - 1];
DP[sc][c][i] = min(v1, v2);
}
}
}
// N ์œ„์น˜๋ฅผ ์ฑ„์šด๋‹ค.
DP[0][0][N] = 0x4FFFFFFF;
DP[1][1][N] = 0x4FFFFFFF;
DP[2][2][N] = 0x4FFFFFFF;
DP[0][1][N] = min(DP[0][0][N-1], DP[0][2][N-1]) + cost[1][N];
DP[0][2][N] = min(DP[0][0][N-1], DP[0][1][N-1]) + cost[2][N];
DP[1][0][N] = min(DP[1][1][N-1], DP[1][2][N-1]) + cost[0][N];
DP[1][2][N] = min(DP[1][0][N-1], DP[1][1][N-1]) + cost[2][N];
DP[2][0][N] = min(DP[2][1][N-1], DP[2][2][N-1]) + cost[0][N];
DP[2][1][N] = min(DP[2][0][N-1], DP[2][2][N-1]) + cost[1][N];
int min = 0x7FFFFFFF;
for(int i = 0; i < 3; ++i) {
for(int j = 0; j < 3; ++j) {
if (DP[i][j][N] < min) min = DP[i][j][N];
}
}
printf("%d\n", min);
return 0;
}
๐Ÿท๏ธ ์ฃผ์ œ ๋ชฉ๋ก: