๐•ƒ๐•ฆ๐•„๐•š๐•ฃ

ใ€ŒโŒจ๏ธแด„sใ€PS/๋ฐฑ์ค€_๋™์ ํ”„๋กœ๊ทธ๋ž˜๋ฐ[DP]

[Baekjoon/๋ฐฑ์ค€][17404][C/C++] RGB๊ฑฐ๋ฆฌ 2

by ๋ฃจ๋ฐ€๐•ƒ๐•ฆ๐•„๐•š๐•ฃ2023. 2. 20.
728x90
๋ฐ˜์‘ํ˜•
ใ€Ž๋ชฉ์ฐจใ€
0. ๊ฐœ์š”

1. ๋ฌธ์ œ
2. ํ’€์ด
3. ์ฝ”๋“œ

0. ๊ฐœ์š”

๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ(Dynamic Programming) ๋ฌธ์ œ. 1149๋ฒˆ RGB๊ฑฐ๋ฆฌ ๋ฌธ์ œ์™€ ์„ธํŠธ๋ฌธ์ œ์ด๋‹ค.

RGB๊ฑฐ๋ฆฌ1(1149๋ฒˆ)๋ฌธ์ œ๋Š” ์„ ํ˜•๋ฐฐ์น˜๋ฌธ์ œ๋ผ ํ•  ์ˆ˜ ์žˆ๊ณ , RGB๊ฑฐ๋ฆฌ2(17404๋ฒˆ)๋ฌธ์ œ๋Š” ์›ํ˜•๋ฐฐ์น˜๋ฌธ์ œ๋ผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

1. ๋ฌธ์ œ

https://www.acmicpc.net/problem/17404

 

17404๋ฒˆ: RGB๊ฑฐ๋ฆฌ 2

์ฒซ์งธ ์ค„์— ์ง‘์˜ ์ˆ˜ N(2 ≤ N ≤ 1,000)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์—๋Š” ๊ฐ ์ง‘์„ ๋นจ๊ฐ•, ์ดˆ๋ก, ํŒŒ๋ž‘์œผ๋กœ ์น ํ•˜๋Š” ๋น„์šฉ์ด 1๋ฒˆ ์ง‘๋ถ€ํ„ฐ ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ ์ฃผ์–ด์ง„๋‹ค. ์ง‘์„ ์น ํ•˜๋Š” ๋น„์šฉ์€ 1,000๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜

www.acmicpc.net

[๋ฌธ์ œ]

RGB๊ฑฐ๋ฆฌ์—๋Š” ์ง‘์ด N๊ฐœ ์žˆ๋‹ค. ๊ฑฐ๋ฆฌ๋Š” ์„ ๋ถ„์œผ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๊ณ , 1๋ฒˆ ์ง‘๋ถ€ํ„ฐ N๋ฒˆ ์ง‘์ด ์ˆœ์„œ๋Œ€๋กœ ์žˆ๋‹ค.

์ง‘์€ ๋นจ๊ฐ•, ์ดˆ๋ก, ํŒŒ๋ž‘ ์ค‘ ํ•˜๋‚˜์˜ ์ƒ‰์œผ๋กœ ์น ํ•ด์•ผ ํ•œ๋‹ค. ๊ฐ๊ฐ์˜ ์ง‘์„ ๋นจ๊ฐ•, ์ดˆ๋ก, ํŒŒ๋ž‘์œผ๋กœ ์น ํ•˜๋Š” ๋น„์šฉ์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ์•„๋ž˜ ๊ทœ์น™์„ ๋งŒ์กฑํ•˜๋ฉด์„œ ๋ชจ๋“  ์ง‘์„ ์น ํ•˜๋Š” ๋น„์šฉ์˜ ์ตœ์†Ÿ๊ฐ’์„ ๊ตฌํ•ด๋ณด์ž.

  • 1๋ฒˆ ์ง‘์˜ ์ƒ‰์€ 2๋ฒˆ, N๋ฒˆ ์ง‘์˜ ์ƒ‰๊ณผ ๊ฐ™์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค.
  • N๋ฒˆ ์ง‘์˜ ์ƒ‰์€ N-1๋ฒˆ, 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]

110

[์˜ˆ์ œ ์ž…๋ ฅ 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]

201

[์˜ˆ์ œ ์ž…๋ ฅ 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
๋ฐ˜์‘ํ˜•

2. ํ’€์ด

https://lumir.tistory.com/47

 

[Baekjoon/๋ฐฑ์ค€][1149][C/C++] RGB๊ฑฐ๋ฆฌ

ใ€Ž๋ชฉ์ฐจใ€ 0. ๊ฐœ์š” 1. ๋ฌธ์ œ 2. ํ’€์ด 3. ์ฝ”๋“œ 0. ๊ฐœ์š” ๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ(Dynamic Programming) ๋ฌธ์ œ. 17404๋ฒˆ RGB๊ฑฐ๋ฆฌ2 ๋ฌธ์ œ์™€ ์„ธํŠธ๋ฌธ์ œ์ด๋‹ค. RGB๊ฑฐ๋ฆฌ1(1149๋ฒˆ)๋ฌธ์ œ๋Š” ์„ ํ˜•๋ฐฐ์น˜๋ฌธ์ œ๋ผ ํ•  ์ˆ˜ ์žˆ๊ณ , RGB๊ฑฐ๋ฆฌ2(17404๋ฒˆ)๋ฌธ

lumir.tistory.com

 

๋ฐฑ์ค€ 1149๋ฒˆ(RGB๊ฑฐ๋ฆฌ)์˜ ์‘์šฉ๋ฒ„์ „์ด๋‹ค. 1149๋ฒˆ ๋ฌธ์ œ๋ฅผ ํ’€๊ณ  ์˜ค๋ฉด ๋ฌธ์ œํ’€์ด๊ฐ€ ์ข€ ๋” ์ˆ˜์›”ํ•˜๋‹ค.

๊ธฐ์กด 1149๋ฒˆ ๋ฌธ์ œ์™€ ๋‹ฌ๋ฆฌ ํ•˜๋‚˜์˜ ์กฐ๊ฑด์ด ๋” ์ถ”๊ฐ€๋˜์—ˆ๋‹ค. ์ฒ˜์Œ๊ณผ ๋งˆ์ง€๋ง‰์ง‘์˜ ์ƒ‰์ด ๋‹ฌ๋ผ์•ผ ํ•œ๋‹ค๋Š” ์ ์ด๋‹ค. ์ด ์กฐ๊ฑด์œผ๋กœ ์ธํ•˜์—ฌ ์ฒซ๋ฒˆ์งธ ์ง‘๊ณผ ๋งˆ์ง€๋ง‰ ์ง‘์ด ์„œ๋กœ ์ด์›ƒ์ด ๋˜์–ด, 1149๋ฒˆ(RGB๊ฑฐ๋ฆฌ) ๋ฌธ์ œ๋Š” ์„ ํ˜•๋ฐฐ์น˜, 17404๋ฒˆ(RGB๊ฑฐ๋ฆฌ 2)๋ฌธ์ œ๋Š” ์›ํ˜•๋ฐฐ์น˜ ๋ฌธ์ œ๋ผ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.

 

์„ ํ˜• ๋ฌธ์ œ์˜ ๊ฒฝ์šฐ, ์ƒ‰์น ์„ ์‹œ์ž‘ํ•ด์•ผ ํ•˜๋Š” ์‹œ์ž‘์ ์ด ๋ช…ํ™•ํ•˜๋‹ค. ๋˜ํ•œ, ์ฒ˜์Œ๊ณผ ๋งˆ์ง€๋ง‰ ์ง‘ ์‚ฌ์ด์˜ ์ƒ‰ ์ค‘๋ณต์„ ๊ณ ๋ คํ•˜์ง€ ์•Š์•„๋„ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, ํ•œ๋ฒˆ์˜ DP๊ณผ์ •์„ ํ†ตํ•ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

์›ํ˜• ๋ฌธ์ œ์˜ ๊ฒฝ์šฐ, ์ƒ‰์น ์„ ์‹œ์ž‘ํ•ด์•ผ ํ•˜๋Š” ์‹œ์ž‘์ ์ด ๋ช…ํ™•ํ•˜์ง€ ์•Š๋‹ค. ๋”ฐ๋ผ์„œ, ์–ด๋–ค ์ง‘ ํ•˜๋‚˜๋ฅผ ์ž„์˜๋กœ ์‹œ์ž‘์ ์œผ๋กœ ์žก์€ ๋’ค ์ƒ‰์„ ์น ํ•ด๋‚˜๊ฐ€์•ผ ํ•œ๋‹ค. ๋˜ํ•œ, ์ฒ˜์Œ๊ณผ ๋งˆ์ง€๋ง‰ ์ง‘์˜ ์ƒ‰์ƒ์ด ๋‹ฌ๋ผ์•ผ ํ•˜๋ฏ€๋กœ, ์ฒ˜์Œ ์‹œ์ž‘์ ์˜ ์ƒ‰์„ R, G, B์ค‘ ํ•˜๋‚˜๋กœ ๊ณ ์ •์‹œ์ผœ๋†“๊ณ  1149๋ฒˆ(RGB๊ฑฐ๋ฆฌ) ๋ฌธ์ œ ๋•Œ ์‚ฌ์šฉํ•œ DP๊ณผ์ •์„ ์ด์šฉํ•ด์•ผ ํ•œ๋‹ค. ์ฒ˜์Œ ์ง‘์ด R, G, B์ผ ๋•Œ, ๊ฐ๊ฐ์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์‚ดํŽด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

X. 1๋ฒˆ์ง‘์ด R์ด๊ณ  ๋งˆ์ง€๋ง‰์ง‘์ด R์ผ๋•Œ ์ตœ์†Œ๋น„์šฉ

1. 1๋ฒˆ์ง‘์ด R์ด๊ณ  ๋งˆ์ง€๋ง‰์ง‘์ด G์ผ๋•Œ ์ตœ์†Œ๋น„์šฉ

2. 1๋ฒˆ์ง‘์ด R์ด๊ณ  ๋งˆ์ง€๋ง‰์ง‘์ด B์ผ๋•Œ ์ตœ์†Œ๋น„์šฉ

3. 1๋ฒˆ์ง‘์ด G์ด๊ณ  ๋งˆ์ง€๋ง‰์ง‘์ด R์ผ๋•Œ ์ตœ์†Œ๋น„์šฉ

X. 1๋ฒˆ์ง‘์ด G์ด๊ณ  ๋งˆ์ง€๋ง‰์ง‘์ด G์ผ๋•Œ ์ตœ์†Œ๋น„์šฉ

4. 1๋ฒˆ์ง‘์ด G์ด๊ณ  ๋งˆ์ง€๋ง‰์ง‘์ด B์ผ๋•Œ ์ตœ์†Œ๋น„์šฉ

5. 1๋ฒˆ์ง‘์ด B์ด๊ณ  ๋งˆ์ง€๋ง‰์ง‘์ด R์ผ๋•Œ ์ตœ์†Œ๋น„์šฉ

6. 1๋ฒˆ์ง‘์ด B์ด๊ณ  ๋งˆ์ง€๋ง‰์ง‘์ด G์ผ๋•Œ ์ตœ์†Œ๋น„์šฉ

X. 1๋ฒˆ์ง‘์ด B์ด๊ณ  ๋งˆ์ง€๋ง‰์ง‘์ด B์ผ๋•Œ ์ตœ์†Œ๋น„์šฉ

์œ„ ๊ฒฝ์šฐ์˜ ์ˆ˜ ์ค‘์—์„œ, 1๋ฒˆ์ง‘๊ณผ ๋งˆ์ง€๋ง‰์ง‘์˜ ์ƒ‰์ƒ์ด ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ๋ฌธ์ œ์˜ ์กฐ๊ฑด์— ์˜ํ•ด ์˜ค๋‹ต์ด ๋˜๋ฏ€๋กœ, ๊ฒฝ์šฐ์˜ ์ˆ˜์—์„œ ์ œ์™ธํ•˜์˜€๋‹ค.

 

DP๊ณผ์ •์„ ๊ทธ๋ฆผ์œผ๋กœ ์‚ดํŽด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. (Bottom Up ๋ฐฉ์‹์œผ๋กœ DP๋ฅผ ์ง„ํ–‰ํ•˜์˜€๋‹ค.)

[Baekjoon/๋ฐฑ์ค€][17404][C/C++] RGB๊ฑฐ๋ฆฌ 2
[Baekjoon/๋ฐฑ์ค€][17404][C/C++] RGB๊ฑฐ๋ฆฌ 2

 

3. ์ฝ”๋“œ

/* ์ข€ ๋” ๊ฐ„๋‹จํ•œ ํ’€์ด : 0๋ฒˆ idx ๊ธฐ๋ณธ์„ธํŒ…. 1๋ฒˆ idx๋ถ€ํ„ฐ DP ๊ณ„์‚ฐ ์‹œ์ž‘. */
#pragma warning(disable:4996)
#include <cstdio>
#include <climits>
#include <algorithm>
#define INF (INT_MAX / 2)
using namespace std;

int table_src[1000][3] = {}; //R=0, G=1, B=2

int main(int argc, char* argv[]) {
	/* Input */
	int N; scanf("%d", &N);
	for (int i = 0; i < N; i++)
		scanf("%d %d %d", &table_src[i][0], &table_src[i][1], &table_src[i][2]);

	/* DP */
	int ans = INF;
	for (int i = 0; i < 3; i++) {
		/* Init */
		int table_dp[1000][3] = {};

		/* i๋ฒˆ ์ง‘์— ์ง€์ •๋œ ์ƒ‰ ์ด์™ธ์˜ ์ƒ‰์€ MAX๋กœ ์ง€์ •ํ•˜์—ฌ dpํ• ๋•Œ ์„ ํƒ๋˜์ง€ ์•Š๋„๋ก ํ•จ. */
		table_dp[0][(i) % 3] = table_src[0][(i) % 3];
		table_dp[0][(i + 1) % 3] = INF;
		table_dp[0][(i + 2) % 3] = INF;

		/* DP */
		for (int j = 1; j < N; j++) {
			table_dp[j][0] = table_src[j][0] + min(table_dp[j - 1][1], table_dp[j - 1][2]);
			table_dp[j][1] = table_src[j][1] + min(table_dp[j - 1][0], table_dp[j - 1][2]);
			table_dp[j][2] = table_src[j][2] + min(table_dp[j - 1][0], table_dp[j - 1][1]);
		}

		/* ์ตœ์†Ÿ๊ฐ’ ์„ ํƒ */
		ans = min({ ans, table_dp[N - 1][(i + 1) % 3], table_dp[N - 1][(i + 2) % 3] });		
	}

	/* Output */
	printf("%d", ans);

	/* End */
	return 0;
}
/* ์ข€ ๋” ๋ณต์žกํ•œ ํ’€์ด : 0, 1๋ฒˆ idx ๊ธฐ๋ณธ์„ธํŒ…. 2๋ฒˆ idx๋ถ€ํ„ฐ DP ๊ณ„์‚ฐ ์‹œ์ž‘. */
#pragma warning(disable:4996)
#include <cstdio>
#include <climits>
#include <algorithm>
using namespace std;

int table_src[1000][3] = {}; //R=0, G=1, B=2

int main(int argc, char* argv[]) {
	/* Input */
	int N; scanf("%d", &N);
	for (int i = 0; i < N; i++)
		scanf("%d %d %d", &table_src[i][0], &table_src[i][1], &table_src[i][2]);

	/* DP */
	int ans = INT_MAX;
	for (int i = 0; i < 3; i++) {
		int table_dp[1000][3] = { table_src[0][0], table_src[0][1], table_src[0][2] };

		table_dp[1][(i) % 3] = INT_MAX;
		table_dp[1][(i + 1) % 3] = table_dp[0][(i) % 3] + table_src[1][(i + 1) % 3];
		table_dp[1][(i + 2) % 3] = table_dp[0][(i) % 3] + table_src[1][(i + 2) % 3];

		for (int j = 2; j < N; j++) {
			table_dp[j][0] = table_src[j][0] + min(table_dp[j - 1][1], table_dp[j - 1][2]);
			table_dp[j][1] = table_src[j][1] + min(table_dp[j - 1][0], table_dp[j - 1][2]);
			table_dp[j][2] = table_src[j][2] + min(table_dp[j - 1][0], table_dp[j - 1][1]);
		}

		ans = min({ ans, table_dp[N - 1][(i + 1) % 3], table_dp[N - 1][(i + 2) % 3] });
	}

	/* Output */
	printf("%d", ans);

	/* End */
	return 0;
}
728x90
๋ฐ˜์‘ํ˜•