[LC150] DP๋ฅผ ํ์ฉํ Jump Game 1 & 2
๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ ์ง์ง ์ด์ฌํ ๊ณต๋ถํ๊ฒ ๊ฐ์๋ฐ... ์ฐฉ๊ฐ์ธ๊ฐ ์ ์๊พธ ๋ชป ํ์ง.. :(
DP๋ฅผ ํธ๋ ๋ฐฉ๋ฒ์ผ๋ก๋ ํํฅ์๊ณผ ์ํฅ์ ๋ฐฉ๋ฒ์ด ์๋๋ฐ ๋๋ ์ฃผ๋ก ํํฅ์ ๋ฐฉ๋ฒ์ผ๋ก ์ฌ๊ท์ ๋ฉ๋ชจ์ด์ ์ด์ ์ ์ฌ์ฉํด์ ํ์๋ค.
Jump Game ๋ฌธ์ ๋
๊ทธ๋ฆฌ๋๋ก๋ ํ ์ ์์ง๋ง DP top-down์ผ๋ก ํ์๋ค. ์ด๋๋ ๋ฐฑํธ๋ํน์ด๋ DP๋ ํท๊ฐ๋ ค์ ํค๋งค๋ค ๊ฒฐ๊ตญ ํ๊ธดํ๋ค.
Jump Game
๋ด ์ฝ๋ | ์ ๋ต ์ฝ๋ |
![]() |
![]() |
์คํ ์์ | ์คํ ์์ |
![]() |
![]() |
์ธํ๊ฐ์ด nums = [1, 2, 1, 1, 1] ์ผ๋ ๋ด๊ฐ ์์ฑํ ์ฝ๋๋ ์ ๋ต ์ฝ๋๋ฅผ ๋น๊ตํด๋ณด๋ฉด ์ธํ๊ฐ์ด wrong answer๊ฐ ๋์จ๋ค.
์คํ์์๋ ๋๊ฐ์๋ฐ dp(0) -> dp(1) -> dp(3) ์ผ๋ก ๊ฐ๋ ๊ฒฝ๋ก๊ฐ ์ ์ผ ์งง์ง๋ง ์ด๊ฑธ ๋ฐ์์ ๋ชป ํด์ฃผ๋ ๊ฒ ๊ฐ๋ค. ๋ ์ฝ๋์ ์ฐจ์ด๋ ์ ๋ต์ฝ๋๋ step์ ๋ด๋ถ์ ์ผ๋ก ๋ค๋ฃจ๊ณ (๋ฉ๋ชจ์ ๋ฐ์ X), ๋ด ์ฝ๋๋ step์ ์ธ์๊ฐ์ผ๋ก ๊ณ์ ๋๊ฒจ์ฃผ๊ณ ์๋ค. ์คํ ์์๋๋ก ๋ ธํธ์ ๊ฐ์ด ์ด๋ป๊ฒ ๋์ด๊ฐ๋์ง ๊ทธ๋ ค๋ณด๋ฉด ๋ด ์ฝ๋๋ ๋ ์งง์ ๊ฒฝ๋ก ์ ์ ์ด๋ฏธ memo๊ฐ์ ์ ๋ฐ์ดํธ ํด์คฌ๊ธฐ ๋๋ฌธ์ dp(4, 3)์ ํธ์ถ ํ ๋ ๊ธฐ์กด์ ์ ์ฅ๋ ๊ฐ์ ๋ฆฌํดํด์ ์ต์๊ฐ์ ์ ๋ฐ์ดํธ ํ์ง ๋ชปํ๋ค.
Memoization์ ํ ๋๋ ์ํ๊ฐ์ด ์ ๋ถ ๋ค์ด๊ฐ๋๋ก ์์ฑํด์ผ ๋๋ค. ์๋ฅผ๋ค์ด ๋ด ์ฝ๋์ ๊ฒฝ์ฐ ์ธ๋ฑ์ค๋ ์คํ ๊ฐ์ ๋๊ฒจ์ฃผ๋๋ฐ dp(4, 4)์ผ ๋๋ dp(4, 3)์ผ๋ ๋ค๋ฅด๊ฒ ์ ์ฅ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ผ์ฐจ์ ๋ฐฐ์ด์ด ์๋๋ผ 2์ฐจ์ ๋ฐฐ์ด๋ก memo[์ธ๋ฑ์ค][์คํ ] ์ด๋ ๊ฒ ์ ์ฅํด์ฃผ๋ฉด memo๋ index์ step๋ฒ ๋ง์ ๋๋ฌํ ์ํ๋ฅผ ์บ์ํ๊ณ ์๊ฒ ๋๋ค. ํ์ง๋ง step์ ๊ตณ์ด memo์ ์ ์ฅํ ํ์๊ฐ ์๋๊ฒ step์ ๋์ ๊ฐ์ด๊ณ ๊ฒฐ๊ณผ์ ์ํฅ์ ์ฃผ๋ ์์๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ๋ฐฐ์ด์๋ index๊ฐ๋ง ๊ฐ์ง๊ณ step์ ๊ฒฐ๊ณผ๋ก๋ง ์ฌ์ฉํ๋ฉด ๋๊ธฐ ๋๋ฌธ์ ์ ๋ต์ฝ๋ ์ฒ๋ผ ์์ฑํด์ผ ํ๋ค. ๊ทผ๋ฐ ์ ๋ ๊ฒ ์์ฑํ๊ธด ์ด๋ ค์๋ณด์ด๋๋ฐ ๋ง์ฝ์ nums = [2, 3, 0, 1, 4] ๊ฐ ๋ค์ด์์ ๋ ์ฒ๋ผ index 2์์ ๊ฒฝ๋ก๊ฐ ๋์ด์ง๋ ๊ฒฝ์ฐ(dead end) if๋ก next != Integer.MAX_VALUE ๊ฐ์ ์ฒดํฌํด ์ฃผ์ง ์์ผ๋ฉด overflow๊ฐ ๋ฐ์ํ๋ค.
๊ทธ๋ฆฌ๊ณ min = Math.min(min, 1+ next) ์ฌ๊ธฐ์ ์คํ ๊ฐ์ ํ๋ ๋ ํด์ค์ผ๋ก์จ ํด๋น ์ธ๋ฑ์ค์์๋ for๋ฌธ์ ๋ค ๊ฒ์ํ ๋ค ์ต์๊ฐ์ ์ ์ฅํ ์ ์๋ค.
๊ทธ๋ผ ๋ด๊ฐ ์ต์ํ์ง ์์ bottom-up ๋ฐฉ๋ฒ์ ๋ณด๋ฉด
๋จผ์ ์์ ์์น ๊ฐ์ dp[0] = 0์ผ๋ก ์ธํ ํด์ฃผ๊ณ ์ธ๋ฑ์ค ๊ธธ์ด๋งํผ ๋ฐ๋ณต๋ฌธ์ ๋๋ฉด์ dp[i + j] ๊ฐ์ ๊ฐฑ์ ํด์ค๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฐ๋ณต๋ฌธ์ด ๋ค ๋๋๋ฉด dp[n - 1] ๊ฐ์ฅ ๋ง์ง๋ง ์์น๋ฅผ ๋ฆฌํดํ๋ค. ์ง๊ธ๊น์ง bottom-up ๋ฐฉ๋ฒ์ด ๋ ์ด๋ ต๋ค๊ณ ์๊ฐํ๋๋ฐ ๊ด์ฐฎ์ ๊ฒ ๊ฐ๊ธฐ๋ ํ๊ณ ... ๋ค์ dp ๋ฌธ์ ๋ ์ด ๋ฐฉ๋ฒ์ผ๋ก๋ ํ์ด๋ด์ผ๊ฒ ๋ค.