์๋ ํ์ธ์ ์ ์ธ์ ๋๋ค!
์ค๋์ <ํ๋ก๊ทธ๋๋จธ์ค(Lv.3) - ์คํฐ์ปค ๋ชจ์ผ๊ธฐ(2)> ๋ฌธ์ ํ์ด๋ฅผ ํตํด dp ์ ํ ํ์ด ๊ณผ์ ์ ์ ๋ฆฌํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
ํด๋น ๋ฌธ์ ๋ฅผ ํ๋ฉด์ ๋ํ์ ์ธ dp ์ ํ์ด๋ผ๊ณ ์๊ฐ์ด ๋ค์ด ์ ๋ฆฌํด๋๋ฉด ์ข์ ๊ฒ ๊ฐ์์ ๊ฐ์ ธ์์ต๋๋ค!
๋ฌธ์ ๋งํฌ
๋ฌธ์ ํ์ด
์ฒ์ ์ ๊ทผ
์ ๋ ์ฒ์์ ํฌํฌ์ธํฐ๋ก ์ ๊ทผ์ ํ์๋๋ฐ์,, ๋ค๋ฅธ ํ์ด๋ฅผ ์ฐธ๊ณ ํด์ dp๋ก ํด๊ฒฐํ ํ ์๊ฐํด๋ณด๋๊น dp๋ก ํ ์ ๋ฐ์ ์๋ ๋ฌธ์ ๋ผ๋ ์๊ฐ์ด ๋๋ ๊ฒ ๊ฐ์ต๋๋ค..! ์ฒ์์ ํฌํฌ์ธํฐ๋ก ์ ๊ทผํ ์ด์ ๋ start, end ํฌ์ธํฐ ๋ชจ๋ 0์ ๋๊ณ ์์ํด์ ์ฒ์์ผ๋ก ๋ผ๋ ์คํฐ์ปค์ ์ธ๋ฑ์ค์ start ํฌ์ธํฐ๋ฅผ ๋๊ณ end ํฌ์ธํฐ ๋ณ์๋ฅผ 2์ฉ ๋๋ ค๊ฐ๋ฉด์(์ธ์ ์ธ๋ฑ์ค์ ์คํฐ์ปค๋ ๋ผ์ง ๋ชปํ๊ธฐ ๋๋ฌธ) ์ฒดํฌํด์ฃผ๋ฉด ๋ ๊ฒ ๊ฐ๋ค๊ณ ์๊ฐํด์ ์์ต๋๋ค. ์ด ๊ณผ์ ์ start๊ฐ 0์ธ ๊ฒฝ์ฐ, 1์ธ ๊ฒฝ์ฐ(์ฒซ๋ฒ์งธ ์คํฐ์ปค๋ฅผ ๋ผ๋๋, ๋๋ฒ์งธ ์คํฐ์ปค๋ฅผ ๋ผ๋๋) ๋ ๋ฒ ์ฒดํฌํด์ ๋น๊ตํด์ฃผ๋ฉด ๋๋ค๊ณ ์๊ฐํ๋๋ฐ!! ํ๊ณ ๋์ ์๊ฐํด๋ณด๋๊น ํ๋ ๊ฑด๋ ํ๋์ฉ ๋ผ๋ ๊ฒฝ์ฐ๋ง ์ฒดํฌํด์ฃผ๋ฉด ํ์ธ ๋ชปํ๊ฒ ๋๋ ์ผ์ด์ค([1, 100, 1, 1, 100] ์ด๋ฐ ์์ผ๋ก ์ฃผ์ด์ง๋ ๊ฒฝ์ฐ )๊ฐ ์๊ธธ ์ ์๊ฒ ๋๋ผ๊ตฌ์.. ๊ทธ๋์ ๋ค๋ฅธ ๋ธ๋ก๊ทธ๋ค์ ํ์ด๋ฅผ ์ฐธ๊ณ ํด์ dp ์๊ณ ๋ฆฌ์ฆ์ ํ์ฉํด์ ์ต์ข ์ ์ผ๋ก ํ์ดํด์ฃผ์์ต๋๋ค!
DP๋ฅผ ํ์ฉํ ํ์ด ๊ณผ์
dp ๋ฌธ์ ๋ dp ์ ํ์ธ์ง๋ง ์ ํ์ ํ๋ฉด(๋ค ์ด๊ฒ ์ด๋ ต์ง๋ง์) ์ ํ์๋ง ์ ์ธ์ฐ๋ฉด ๊ฒฐ๊ณผ ๊ฐ์ ๋์ถํด๋ผ ์ ์์ต๋๋ค!
์ ํ์์ ์ธ์ฐ๊ธฐ ์ํด์๋ ๊ท์น์ ์ ํ์ ํ๋ฉด ๋๊ฒ ์ฃ ??
์ด ๋ฌธ์ ์์ ์ฐพ์ ์ ์๋ ๊ท์น์, ์ผ๋จ ์ฒซ๋ฒ์งธ ์คํฐ์ปค๋ฅผ ๋ฏ์์ ๊ฒฝ์ฐ์ ๋ฏ์ง ์์์ ๊ฒฝ์ฐ ์ด๋ ๊ฒ ๋ ๊ฐ์ง ์ผ์ด์ค๋ก ๋๋๋ค๋ ๊ฒ์ ๋๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ฏ์ ์คํฐ์ปค์ ์ ํ ์ซ์๋ค์ ํฉ์ ์ ์ฅํ ๋ฐฐ์ด์ ๋ ๊ฐ ๋ง๋ค์ด ์ค๋๋ค. (dp1, dp2)
์ด ๋ ๋ฐฐ์ด์ ํฌ๊ธฐ๋ sticker ๋ฐฐ์ด์ ํฌ๊ธฐ์ ๊ฐ๊ณ ์ธ๋ฑ์ค์๋ ์ง๊ธ๊น์ง ๋ฏ์ ์คํฐ์ปค์ ์ ํ ์ซ์๋ค์ ํฉ์ด ์ ์ฅ๋๊ณ , (๋ฉ๋ชจ์ด์ ์ด์ ๊ธฐ๋ฒ) ๊ฐ์ฅ ๋ง์ง๋ง์ ๋ฏ์ ์คํฐ์ปค์ ์ธ๋ฑ์ค์ ์ต์ข ๊ฐ์ด ์ ์ฅ๋๊ฒ ๋ฉ๋๋ค.
์ฒซ๋ฒ์งธ ์คํฐ์ปค๋ฅผ ๋ฏ์ ๊ฒฝ์ฐ(dp1), sticker[0] ์๋ฆฌ์ ์คํฐ์ปค๋ฅผ ๋ฏ์ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ dp1[0]์ sticker[0] ๊ฐ์ ์ ์ฅํด์ฃผ๊ณ , ๋ฐ๋ก ์ ์คํฐ์ปค์ธ dp1[1]์ ๋ฏ์ง ๋ชปํ๋ ์คํฐ์ปค์ด๊ธฐ ๋๋ฌธ์ ๋๊ฐ์ด sticker[0]์ ๊ฐ์ ์ ์ฅํด์ค๋๋ค.
์ฒซ๋ฒ์งธ ์คํฐ์ปค๋ฅผ ๋ฏ์ง ์์ ๊ฒฝ์ฐ(dp2), ๋๋ฒ์งธ ์๋ฆฌ์ ์คํฐ์ปค๋ฅผ ๋ฏ์ ์ ์๊ธฐ ๋๋ฌธ์ dp[1]์ ์ผ๋จ sticker[1]์ ์ ์ฅํด์ค๋๋ค.
๊ทธ ๋ค์, for ๋ฌธ์ ์ด์ฉํด ๊ฐ๋ฅํ ๋ฒ์(์ฒซ๋ฒ์งธ๋ฅผ ๋ฏ์ ๊ฒฝ์ฐ๋ ๋ง์ง๋ง ์คํฐ์ปค ๋ชป๋ฏ๊ธฐ ๋๋ฌธ์ n-2๋ฒ์งธ ์ธ๋ฑ์ค๊น์ง)๊น์ง ๊ฒ์ฌํด์ค๋๋ค.
dp[i] = max(dp[i-2] + sticker[i], dp[i-1])
for๋ฌธ์์ ์ด์ฉํ๊ฒ ๋๋ ์ ํ์์ i๋ฒ์งธ ์คํฐ์ปค๋ฅผ ๋ผ๋ ๊ฒ์ด ์ข์์ง ์๋์ง ๊ฒฐ์ ํ๋ ๊ณผ์ ์ผ๋ก, ์์ ๊ฐ์ต๋๋ค.
i๋ฒ์งธ ์คํฐ์ปค๋ฅผ ๋ ๊ฒฝ์ฐ, i-1๋ฒ์งธ ์คํฐ์ปค๋ ๋ผ์ง ๋ชปํ๋ฏ๋ก dp[i-2] + sticker[i]๊ฐ ์ต์ ์ด ๋๊ณ ,
๋ผ์ง ์์ ๊ฒฝ์ฐ๋ dp[i-1]์ด ์ต์ ์ด ๋๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ dp[i]์ ์ ์ฅ๋๋ ๊ฐ(= ๋์ ํฉ์ ์ต๋๊ฐ)์ผ๋ก dp[i-2] + sticker[i] ์ dp[i-1] ์ค ํฐ ๊ฐ์ ๊ณจ๋ผ์ฃผ๋ฉด ๋๋ ๊ฒ์ ๋๋ค.
Swift ํ์ด ์ฝ๋
import Foundation
func solution(_ sticker:[Int]) -> Int{
let n = sticker.count
if n <= 2 {
return sticker.max()!
}
var dp1 = Array(repeating: 0, count: n)
var dp2 = Array(repeating: 0, count: n)
// ์ฒซ๋ฒ์งธ ์คํฐ์ปค๋ฅผ ๋ฏ์์ ๊ฒฝ์ฐ
dp1[0] = sticker[0]
dp1[1] = sticker[0]
// ์ฒซ๋ฒ์งธ ์คํฐ์ปค๋ฅผ ๋ฏ์ง ์์์ ๊ฒฝ์ฐ
dp2[0] = 0
dp2[1] = sticker[1]
for i in 2..<n {
dp2[i] = max(dp2[i-2] + sticker[i], dp2[i-1])
if i < n - 1 {
dp1[i] = max(dp1[i-2] + sticker[i], dp1[i-1])
}
}
return max(dp1[n-2], dp2[n-1])
}
[์ฐธ๊ณ ์๋ฃ]