๋ฐ์ํ
๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/16194
ํ์ด IDEA
์ด์ ๋ฌธ์ "์นด๋ ๊ตฌ๋งคํ๊ธฐ"๋ฅผ ๋จผ์ ํ์ด๋ณด๋ฉด ๋ฐ๋ก ์ ์ ์๋ ๋ฌธ์ ์ด๋ค. (๋ณต์ตํ๋ค๋ ์๊ฐ์ผ๋ก ๋ค์ ํ์ด ์์ด๋์ด๋ฅผ ์ ์ด๋ณด์)
- ๊ตฌ๋งค๋ฅผ ์ํ๋ ์นด๋์ ์๋ฅผ n , ์นด๋ ํฉ ๊ฐ๊ฐ์ ๊ฐ๊ฒฉ์ ๋ฐฐ์ด p ์ ์ ๋ ฅ์ ๋ฐ์ ๊ฒ์ด๋ค.
- dp ๋ฐฐ์ด์ ์์ฑํ์ฌ ์กฐ๊ฑด ๋ฒ์ ๋ฐ์ ์์ธ 99999 ๋ฅผ n+1 ํฌ๊ธฐ๋งํผ ๋ฃ์ด์ค๋ค.
- ๊ฐ์ฅ ํฐ ์ 999999๋ฅผ ๋ฃ๋ ์ด์ ๋, ์ฐ๋ฆฌ๋ min ๊ฐ์ ๊ตฌํ ๊ฒ์ด๋ค. ๋ฒ์ ๋ฐ์ ์๋ ์๋ฅผ ๋ฃ์์ผ๋ก์จ, ํญ์ ์์ ๊ฐ์ด ์ ํ๋๊ฒ๋ ๋ง๋ค ์ ์๋ค.
- dp ๋ฐฐ์ด์๋, ์ธ๋ฑ์ค ์์๋๋ก ์ต์ ๊ธ์ก์ด ๋ค์ด๊ฐ๋ค. dp[1] : ์นด๋ 1๊ฐ๋ฅผ ๊ตฌ๋งคํ ๋ ์ต์ ๊ธ์ก, dp[2] : ์นด๋ 2๊ฐ๋ฅผ ๊ตฌ๋งคํ ๋์ ์ต์๊ธ์ก... ์ด๋ฐ์์ผ๋ก ๋ง์ด๋ค.
- ์ฐ๋ฆฌ๊ฐ ๊ตฌํ๊ณ ์ ํ๋ ๊ฒ์, N ์ฅ์ ์นด๋๋ฅผ ๊ตฌ๋งคํ ๋ ์ต์ ๊ธ์ก์ ์ฌ์ฉํด์ผํ๋, ์ด ์ต์๊ธ์ก์ด๋ค. ์ต์๊ธ์ก์ ์ด๋ป๊ฒ ๊ตฌํ ์ ์์๊น?
- ์์ 1๋ฒ์ ํ์ฉํด์ ์ ํ์์ ๊ตฌํด๋ณด์. ์ฐ๋ฆฌ๋ ์นด๋ 4์ฅ์ด ํ์ํ๋ค. 4์ฅ์ ๊ตฌ๋งคํ๊ธฐ ์ํด์๋ ์๋์ ๊ฐ์ด ๊ตฌ๋งคํ ์ ์๋ค.
- ์นด๋ 3์ฅ์ ์ด๋ค ๋ฐฉ์์ผ๋ก๋ ๊ตฌ๋งค + ์นด๋ 1ํฉ์ง๋ฆฌ ๊ตฌ๋งค
- ์นด๋ 2์ฅ์ ์ด๋ค ๋ฐฉ์์ผ๋ก๋ ๊ตฌ๋งค + ์นด๋ 2ํฉ์ง๋ฆฌ ๊ตฌ๋งค
- ์นด๋ 1์ฅ์ ์ด๋ค ๋ฐฉ์์ผ๋ก๋ ๊ตฌ๋งค + ์นด๋ 3ํฉ์ง๋ฆฌ ๊ตฌ๋งค
- ์นด๋ 0์ฅ์ ์ด๋ค ๋ฐฉ์์ผ๋ก๋ ๊ตฌ๋งค + ์นด๋ 4ํฉ์ง๋ฆฌ ๊ตฌ๋งค ์ด๋ ๊ฒ ๊ตฌํ ์ ์๋ค.
- ๊ทธ๋ผ ์ด๊ฑธ ์ต์๊ธ์ก์ผ๋ก ์๊ฐํด๋ณด์. ์ด๋ป๊ฒ ํ๋ฉด ์ต์๊ธ์ก์ด ๋์ฌ๊น?
- ์นด๋ 3์ฅ์ ์ต์ํ์ ๊ธ์ก์ผ๋ก ๊ตฌ๋งคํ๊ณ + ์นด๋ 1ํฉ์ง๋ฆฌ ๊ตฌ๋งค
- ์นด๋ 2์ฅ์ ์ต์ํ์ ๊ธ์ก์ผ๋ก ๊ตฌ๋งคํ๊ณ + ์นด๋ 2ํฉ์ง๋ฆฌ ๊ตฌ๋งค
- ์นด๋ 1์ฅ์ ์ต์ํ์ ๊ธ์ก์ผ๋ก ๊ตฌ๋งคํ๊ณ + ์นด๋ 3ํฉ์ง๋ฆฌ ๊ตฌ๋งค
- ์นด๋ 0์ฅ์ ์ต์ํ์ ๊ธ์ก์ผ๋ก ๊ตฌ๋งคํ๊ณ + ์นด๋ 4ํฉ์ง๋ฆฌ ๊ตฌ๋งค
- ์ ๋ค ๊ฐ์ง ๊ฒฝ์ฐ ๋ชจ๋ 4์ฅ์ ์นด๋๋ฅผ ๊ตฌ๋งคํ๋ ๊ฒฝ์ฐ์ด๊ณ , ์ด์ค์์ ์ต์!!๊ธ์ก์ ์ฐพ์ผ๋ฉด ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๋ต์ด ๋์จ๋ค.
- ์ซ์๊ฐ ๋๊ฐ๊ฐ ๋ณํ๋ ๋ฐ๋ณต๋ฌธ์ ๊ตฌํํ๊ธฐ ์ํด ์ด์ค for-in ๊ตฌ๋ฌธ์ ์ฌ์ฉํด์ ๊ทธ๋๋ก ๊ตฌํํ๋ฉด ๋๋ค.
์์ค์ฝ๋
let n = Int(readLine()!)!
let p = readLine()!.split(separator: " ").map { Int(String($0))! }
var dp = [Int](repeating: 999999, count: n+1)
//์ต์๊ฐ์ ์ถ์ถํด์ผํ๋๊น dp ๋ฅผ ์กฐ๊ฑด ๋ฒ์ ๋ฐ์ ์๋ก ์ฑ์๋ฃ์ด์ฃผ์๋ค.
dp[0] = 0
// 0์ ๋ฃ์ด์ค ์ด์ ๋, ์๋ for ๋ฌธ์ ๋๋ฉด์ i=1,j=1 ์ผ๋ dp[0]+p[0]์ด ๊ณ์ฐ๋ ํ
๋ฐ, ์ด๋ ํ์ 999999 ๊ฐ ๋ค์ด๊ฐ๋ฉด ์๋๊ธฐ ๋๋ฌธ์ด๋ค.
for i in 1..<n+1 {
for j in 1..<i+1 {
dp[i] = min(dp[i], dp[i-j]+p[j-1])
}
}
print(dp[n])
๋ฐ์ํ