๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm

[๋ฐฑ์ค€] 1149๋ฒˆ: RGB๊ฑฐ๋ฆฌ(DP)

by ์ฃผ๋ฐœ2 2020. 2. 26.
๋ฐ˜์‘ํ˜•

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

 

1149๋ฒˆ: RGB๊ฑฐ๋ฆฌ

RGB๊ฑฐ๋ฆฌ์— ์‚ฌ๋Š” ์‚ฌ๋žŒ๋“ค์€ ์ง‘์„ ๋นจ๊ฐ•, ์ดˆ๋ก, ํŒŒ๋ž‘์ค‘์— ํ•˜๋‚˜๋กœ ์น ํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ๋˜ํ•œ, ๊ทธ๋“ค์€ ๋ชจ๋“  ์ด์›ƒ์€ ๊ฐ™์€ ์ƒ‰์œผ๋กœ ์น ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ทœ์น™๋„ ์ •ํ–ˆ๋‹ค. ์ง‘ i์˜ ์ด์›ƒ์€ ์ง‘ i-1๊ณผ ์ง‘ i+1์ด๊ณ , ์ฒซ ์ง‘๊ณผ ๋งˆ์ง€๋ง‰ ์ง‘์€ ์ด์›ƒ์ด ์•„๋‹ˆ๋‹ค. ๊ฐ ์ง‘์„ ๋นจ๊ฐ•์œผ๋กœ ์น ํ•  ๋•Œ ๋“œ๋Š” ๋น„์šฉ, ์ดˆ๋ก์œผ๋กœ ์น ํ•  ๋•Œ ๋“œ๋Š” ๋น„์šฉ, ํŒŒ๋ž‘์œผ๋กœ ๋“œ๋Š” ๋น„์šฉ์ด ์ฃผ์–ด์งˆ ๋•Œ, ๋ชจ๋“  ์ง‘์„ ์น ํ•˜๋Š” ๋น„์šฉ์˜ ์ตœ์†Ÿ๊ฐ’์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

www.acmicpc.net

์ฝ”๋“œ

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		int N = Integer.parseInt(bf.readLine());
		int[][] dp = new int[N][3];
		int minMoney = 0;
		for(int i=0; i<N; i++) {
			StringTokenizer st = new StringTokenizer(bf.readLine());
			dp[i][0] = Integer.parseInt(st.nextToken());	// Red
			dp[i][1] = Integer.parseInt(st.nextToken());	// Green
			dp[i][2] = Integer.parseInt(st.nextToken());	// Blue
		}
		
		for(int i=1; i<N; i++) {
			dp[i][0] += Math.min(dp[i-1][1], dp[i-1][2]);	// R์ผ๋•Œ ์ตœ์†Œ ๋น„์šฉ -> G, B ๋น„๊ต
			dp[i][1] += Math.min(dp[i-1][0], dp[i-1][2]);	// G์ผ๋•Œ ์ตœ์†Œ ๋น„์šฉ -> R, B ๋น„๊ต
			dp[i][2] += Math.min(dp[i-1][0], dp[i-1][1]);	// B์ผ๋•Œ ์ตœ์†Œ ๋น„์šฉ -> R, G ๋น„๊ต
		}
		minMoney = Math.min(dp[N-1][0], (Math.min(dp[N-1][1], dp[N-1][2])));	// R, G, B ์ค‘ ์ตœ์†Œ ๋น„์šฉ ๊ตฌํ•˜๊ธฐ
		System.out.println(minMoney);
		bf.close();
	}

}

ํ’€์ด

์ „ํ˜•์ ์ธ Dynamic Programming(๋™์  ๊ณ„ํš๋ฒ•)์˜ ๋ฌธ์ œ๋‹ค. ์•„์ง์€ DP๋ฌธ์ œ์— ๋Œ€ํ•œ ๊ฐ์ด ์ข€ ๋ถ€์กฑํ•œ ์ƒํƒœ์—ฌ์„œ ๋ธ”๋กœ๊ทธ๋“ค์„ ์ฐธ๊ณ ํ•˜๋‹ˆ 2์ฐจ์›๋ฐฐ์—ด๋กœ ํ•ด๊ฒฐํ•˜๊ธธ๋ž˜, ์ฐธ์กฐํ•ด์„œ ํ’€์–ด๋ณด๋‹ˆ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

i๋ฒˆ์งธ ์ง‘์— ์ƒ‰์„ ์น ํ• ๋•Œ, ๊ทธ i๋ฒˆ์งธ์˜ ์ง‘์— R, G, B ์„ธ ๊ฐ€์ง€์˜ ์ƒ‰์„ ์น ํ•˜๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์‚ดํŽด๋ด์•ผํ•œ๋‹ค.

 

โ— i๋ฒˆ์งธ์— ๋นจ๊ฐ•์ƒ‰์„ ์น ํ•  ๊ฒฝ์šฐ.

  i-1๋ฒˆ์งธ์— ์น ํ•  ์ˆ˜ ์žˆ๋Š” ์ƒ‰์€ ์ดˆ๋ก์ƒ‰๊ณผ ํŒŒ๋ž‘์ƒ‰์ด ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ i๋ฒˆ์งธ์— ์น ํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œ ๋น„์šฉ์€ ...

์ดˆ๋ก + ๋นจ๊ฐ• = dp[i][1] + dp[i][0]

ํŒŒ๋ž‘ + ๋นจ๊ฐ• = dp[i][2] + dp[i][0] 

๋‘ ๊ฐœ์˜ ๊ฐ’ ์ค‘ ์ตœ์†Ÿ๊ฐ’์ด ์ตœ์†Œ ๋น„์šฉ์ด ๋œ๋‹ค.

 

์œ„ ์‹์„ ์ ํ™”์‹์œผ๋กœ ์„ธ์šฐ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

dp[i][0] += Math.min(dp[i-1][1], dp[i-1][2]);

-> i๋ฒˆ์งธ ์ง‘์„ ๋นจ๊ฐ•์ƒ‰์œผ๋กœ ์น ํ•  ๊ฒฝ์šฐ -> i-1๋ฒˆ์งธ๊ฐ€ ์ดˆ๋ก๊ณผ ํŒŒ๋ž‘์ค‘ ์ตœ์†Ÿ๊ฐ’์˜ ๊ฒฝ์šฐ์ด๋‹ค.

 

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ดˆ๋ก, ํŒŒ๋ž‘์ƒ‰์˜ ๊ฒฝ์šฐ๋„ ๋™์ผํ•œ ์ ํ™”์‹์„ ์„ธ์šธ ์ˆ˜ ์žˆ๋‹ค.

dp[i][1] += Math.min(dp[i-1][0], dp[i-1][2]);
dp[i][2] += Math.min(dp[i-1][0], dp[i-1][1]);	

๋”ฐ๋ผ์„œ dp[i][] ๋ฒˆ์งธ์—๋Š”,

dp[i][0] => i๋ฒˆ์งธ๋ฅผ ๋นจ๊ฐ•์ƒ‰์œผ๋กœ ์น ํ•  ๊ฒฝ์šฐ์˜ ์ตœ์†Œ ๋น„์šฉ

dp[i][1] => i๋ฒˆ์งธ๋ฅผ ์ดˆ๋ก์ƒ‰์œผ๋กœ ์น ํ•  ๊ฒฝ์šฐ์˜ ์ตœ์†Œ ๋น„์šฉ

dp[i][2] => i๋ฒˆ์งธ๋ฅผ ํŒŒ๋ž‘์ƒ‰์œผ๋กœ ์น ํ•  ๊ฒฝ์šฐ์˜ ์ตœ์†Œ ๋น„์šฉ

์ด ์ €์žฅ๋œ๋‹ค.

์„ธ ๊ฐ’์ค‘ ๊ฐ€์žฅ์ ์€ ์ตœ์†Œ๋น„์šฉ์„ ์„ ํƒํ•˜๋ฉด ๊ทธ ๊ฐ’์ด ๊ฒฐ๊ณผ๊ฐ’์ด ๋œ๋‹ค.

 

 

 

Scanner(์•„๋ž˜) ์™€ BufferedReader(์œ„)์˜ ์‹œ๊ฐ„ ์ฐจ์ด, ์•ฝ 2๋ฐฐ !

 

 

๋” ์ƒ์„ธํ•œ ํ•ด์„ค์„ ์›ํ•˜๋ฉด ์•„๋ž˜๋ฅผ ํด๋ฆญ,

๋ฐฑ์ค€1149๋ฒˆ

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€