์ฝ”๋”ฉํ…Œ์ŠคํŠธ/TIL

[LC150] DP๋ฅผ ํ™œ์šฉํ•œ Jump Game 1 & 2

moon101 2025. 7. 6. 02:36

 

๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ง„์งœ ์—ด์‹ฌํžˆ ๊ณต๋ถ€ํ•œ๊ฒƒ ๊ฐ™์€๋ฐ... ์ฐฉ๊ฐ์ธ๊ฐ€ ์™œ ์ž๊พธ ๋ชป ํ’€์ง€.. :(

 

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 ๋ฌธ์ œ๋Š” ์ด ๋ฐฉ๋ฒ•์œผ๋กœ๋„ ํ’€์–ด๋ด์•ผ๊ฒ ๋‹ค.