Potato
์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐ์žก๋‹ˆ๋‹ค?๐Ÿฅ” ^___^ ๐Ÿ˜บ github ๋ฐ”๋กœ๊ฐ€๊ธฐ ๐Ÿ‘‰๐Ÿป

Algorithm/Baekjoon

[๋ฐฑ์ค€] (Swift) 1149๋ฒˆ - RGB๊ฑฐ๋ฆฌ (dp ์˜ ๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ธ ์œ ํ˜•, ๋งˆ์ง€๋ง‰ ์ˆ˜์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜)

๊ฐ์ž ๐Ÿฅ” 2022. 3. 19. 02:43
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ๋งํฌ

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

 

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

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

www.acmicpc.net

 

ํ’€์ด IDEA

์šฐ์„ , ๋ฌธ์ œ๋ฅผ ์ฝ์–ด๋ณด๋ฉด ์กฐ๊ฑด์ด ์„ธ๊ฐœ ๋‚˜ ๋‹ฌ๋ ค์žˆ์ง€๋งŒ, ๋‹ค ๊ฐ™์€ ๋ง์ด๋‹ค. ๊ทธ์ € ์ง‘์˜ ์ƒ‰์ƒ์€ ์•ž๋’ค ์ง‘๊ณผ ๊ฒน์น˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค๋Š” ํ•˜๋‚˜์˜ ์กฐ๊ฑด์ผ ๋ฟ์ธ ๊ฒƒ์ด๋‹ค. 1๋ฒˆ์ง‘์ด ๋นจ๊ฐ„์ƒ‰์ด๋ฉด, 2๋ฒˆ์ง‘์€ ํŒŒ๋ž‘์ด๋‚˜ ์ดˆ๋ก์ด๋ฉด ๋˜๊ณ , 50๋ฒˆ์งธ ์ง‘์ด ๋นจ๊ฐ•์ด๋ผ๋ฉด, 49๋ฒˆ์ง‘๊ณผ 51๋ฒˆ์ง‘์€ ๋นจ๊ฐ•์ด ์•„๋‹ˆ๋ฉด ๋œ๋‹ค.

๋‚˜๋Š” ์ด๋ฌธ์ œ๋ฅผ ๋ณด๊ณ  ๋ฐ”๋กœ ์ด ๋ฌธ์ œ(click!!)๋ฅผ ํ’€์—ˆ๋˜ ๊ฒฝํ—˜์„ ์ƒ๊ฐํ–ˆ๋‹ค. ๋งˆ์ง€๋ง‰์— ์–ด๋–ค ์ˆ˜๋ฅผ ๋ฐฐ์น˜ํ•˜๋Š๋ƒ์— ๋”ฐ๋ผ ํ˜„์žฌ์˜ ์ƒ‰์ƒ์ด ๋‹ฌ๋ผ์ง€๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋‚˜๋ˆ ์„œ ์ƒ๊ฐํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์šฐ๋ฆฌ๋Š” ์ง‘๋งˆ๋‹ค ๋‹ค๋ฅธ rgb ์ƒ‰์ƒ ๊ฐ€๊ฒฉ๋„ ์ž…๋ ฅ๋ฐ›์•„์•ผํ•˜๊ณ , dp ๋ฐฐ์—ด๋„ ์ž‘์„ฑํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ—ท๊ฐˆ๋ฆฌ์ง€ ์•Š๋„๋ก ํ‘œ๋กœ ๊ทธ๋ ค์„œ ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ๋‹ค.

์šฐ์„  ๋งจ ์ฒ˜์Œ์— n ์— ๋Œ€ํ•œ ์ƒ์ˆ˜๋ฅผ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค.

let n = Int(readLine()!)!

 

๊ทธ ๋‹ค์Œ RGB ๊ฐ€๊ฒฉ์— ๋Œ€ํ•œ ์ž…๋ ฅ์„ 3์ฐจ์› ๋ฐฐ์—ด๋กœ ์ž…๋ ฅ๋ฐ›์•˜๋‹ค. ์•„๋ž˜ ์จ์žˆ๋“ฏ์ด R์ƒ‰์ƒ์€ ์ธ๋ฑ์Šค 0์œผ๋กœ ์ง€์นญํ•  ๊ฒƒ์ด๊ณ , G๋Š” 1, B๋Š” 2๋กœ ์ง€์นญํ•  ๊ฒƒ์ด๋‹ค. 

var rgbPrice = Array(repeating:[0,0,0], count: n+1) //RGB => 012 ์ˆœ์„œ

for i in 1..<n+1 {  // rgbPrice[์ง‘๋ฒˆํ˜ธ][012์ˆœ์„œ๋Œ€๋กœ ๊ฐ€๊ฒฉ]
    rgbPrice[i] = readLine()!.split(separator: " ").map {Int(String($0))!}
}

๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๋Š” dp ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•  ๊ฒƒ์ด๋‹ค. dp ๋ฐฐ์—ด์€ n x 3 ์˜ ํฌ๊ธฐ๋กœ ๋งŒ๋“ค ๊ฒƒ์ด๋‹ค. ์—ฌ๊ธฐ์„œ n ์€ ์ฒ˜์Œ์— ์ž…๋ ฅ๋ฐ›์€ ์ง‘์˜ ๊ฐœ์ˆ˜์ด๋‹ค. ๊ทธ๋Ÿผ ์šฐ๋ฆฌ๋Š” dp[์ง‘๋ฒˆํ˜ธ][R, G, B] ์ด๋Ÿฌํ•œ ๋ฐฐ์—ด์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.

var dp = Array(repeating: Array(repeating: 0, count: 3), count: n+1) //dp[์ง‘๋ฒˆํ˜ธ][์ƒ‰์ƒ]

 

์ด์ œ ์ž…๋ ฅ์„ ๋ชจ๋‘ ๋ฐ›์•˜์œผ๋‹ˆ, dp ์ ํ™”์‹์„ ์ฐพ์•„๋ณด์ž. ์กฐ๊ฑด์œผ๋กœ ์ฃผ์–ด์ง„ ๊ฒƒ์ฒ˜๋Ÿผ, 1๋ฒˆ์ง‘์ด ๋งŒ์•ฝ R ์ƒ‰์ƒ์ด๋ผ๋ฉด, 2๋ฒˆ์ง‘์€ G๋‚˜ B์ƒ‰์ƒ์œผ๋กœ ์น ํ•ด์ ธ์•ผํ•˜๊ณ , 2๋ฒˆ ์ง‘ ์ƒ‰์ƒ์ด G๋กœ ์น ํ•ด์กŒ๋‹ค๋ฉด, 3๋ฒˆ ์ง‘์€ R์ด๋‚˜ B๋กœ ์น ํ•ด์ ธ์•ผ ํ•œ๋‹ค. ์ด๋ฅผ ํ‘œ๋กœ ๋‚˜ํƒ€๋‚ด๋ณด์ž.

์œ„์™€ ๊ฐ™์€ ํ‘œ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๊ณ , dp[๋งˆ์ง€๋ง‰์ง‘]์˜ R,G,B ๊ฐ’์—์„œ ์ตœ์†Œ๊ฐ’์„ ์ฐพ์œผ๋ฉด ์ •๋‹ต์ด ๋  ๊ฒƒ์ด๋‹ค. ์šฐ๋ฆฌ๋Š” ์ตœ์†Œ๊ฐ’์„ ๊ตฌํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ์ด์ „์— ๋ฌด์Šจ์ƒ‰์ƒ์ด ์น ํ•ด์ ธ ์žˆ๋Š”์ง€๋งŒ ์‚ดํŽด๋ณด๊ณ , ์ง€๊ธˆ ์น ํ•  ์ˆ˜ ์žˆ๋Š” ์ƒ‰์ƒ ์ค‘ ์ตœ์†Œ๊ฐ€๊ฒฉ์„ ๊ฐ–๋Š” ์ƒ‰์ƒ์„ ์ฐพ์•„ ๋”ํ•ด์ฃผ๋ฉด ๋˜๋Š” ๊ฒƒ์ด๋‹ค. 

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

์–ด๋””์„œ ๋งŽ์ด ๋ดค๋˜ ๊ทœ์น™์ด๋‹ค!! ์šฐ๋ฆฌ๊ฐ€ ์ด๋ ‡๊ฒŒ ๋งˆ์ง€๋ง‰์— ์˜ค๋Š” ์ˆ˜๋‚˜ ์ƒ‰์ƒ, ์กฐ๊ฑด์„ ๊ณ ๋ คํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ’€๋•Œ ํ•ญ์ƒ ์ด๋Ÿฌํ•œ ๊ทœ์น™์˜ ์ ํ™”์‹์ด ๋‚˜์˜จ๋‹ค. dp๋Š” ๋งŽ์ด ์—ฐ์Šตํ•  ์ˆ˜๋ก ๋งŽ์ด ํ’€์ˆ˜๋ก ๊ทœ์น™์ด ๋” ์ž˜๋ณด์ผ ๊ฒƒ ๊ฐ™๋‹ค.

์œ„์—์„œ ์„ค๋ช…ํ•œ ๊ฒƒ๋“ค์„ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

์ „์ฒด ์†Œ์Šค์ฝ”๋“œ - ๋งž์•˜์Šต๋‹ˆ๋‹ค!

let n = Int(readLine()!)!
var rgbPrice = Array(repeating:[0,0,0], count: n+1) //RGB => 012 ์ˆœ์„œ
var dp = Array(repeating: Array(repeating: 0, count: 3), count: n+1) //dp[์ง‘๋ฒˆํ˜ธ][์ƒ‰์ƒ]
for i in 1..<n+1 {  // rgbPrice[์ง‘๋ฒˆํ˜ธ][012์ˆœ์„œ๋Œ€๋กœ ๊ฐ€๊ฒฉ]
    rgbPrice[i] = readLine()!.split(separator: " ").map {Int(String($0))!}
}


for i in 1..<n+1 {
    dp[i][0] = min(dp[i-1][1], dp[i-1][2]) + rgbPrice[i][0]
    dp[i][1] = min(dp[i-1][0], dp[i-1][2]) + rgbPrice[i][1]
    dp[i][2] = min(dp[i-1][0], dp[i-1][1]) + rgbPrice[i][2]
}

print(dp[n].min()!)

 

๋ฐ˜์‘ํ˜•