๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/1149
ํ์ด 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()!)