|
| 1 | +# https://leetcode.com/problems/jump-game/ |
| 2 | + |
| 3 | +from typing import List |
| 4 | + |
| 5 | +class Solution: |
| 6 | + def canJump_slow_dp(self, nums: List[int]) -> bool: |
| 7 | + """ |
| 8 | + [Complexity] |
| 9 | + - TC: O(n^2) |
| 10 | + - SC: O(n) |
| 11 | +
|
| 12 | + [Approach] |
| 13 | + dp[i] = i-th idx์์ ๋ง์ง๋ง ์นธ๊น์ง ๋๋ฌ ๊ฐ๋ฅํ์ง ์ฌ๋ถ |
| 14 | + ๋งจ ์ค๋ฅธ์ชฝ ์นธ๊น์ง์ ๋๋ฌ ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ํ์ธํด์ผ ํ๋ฏ๋ก, nums[i] ๋งํผ ์ค๋ฅธ์ชฝ์ผ๋ก ๊ฐ๋ด์ผ ํ๋ค. |
| 15 | + ๋ฐ๋ผ์ ๋งจ ์ค๋ฅธ์ชฝ๋ถํฐ dp table์ ์ฑ์๋๊ฐ๋ฉด ๋๊ณ , nums[i] ๋งํผ ์ค๋ฅธ์ชฝ์ผ๋ก ๊ฐ๋ณด๋ค๊ฐ True์ผ ๋๊ฐ ๋์ค๋ฉด ๋น ๋ฅด๊ฒ break ํ๋ค. |
| 16 | + """ |
| 17 | + n = len(nums) |
| 18 | + dp = [False] * n |
| 19 | + dp[n - 1] = True |
| 20 | + |
| 21 | + # i ๋ณด๋ค ์ค๋ฅธ์ชฝ ๊ฐ์ด ํ์ํ๋ฏ๋ก, ์ค๋ฅธ์ชฝ์์๋ถํฐ dp table ์ฑ์๋๊ฐ๊ธฐ |
| 22 | + for i in range(n - 2, -1, -1): |
| 23 | + # i์์ nums[i] ๋งํผ ์ค๋ฅธ์ชฝ์ผ๋ก ๊ฐ๋ณด๊ธฐ |
| 24 | + for di in range(nums[i] + 1): |
| 25 | + # ์ค๊ฐ์ ๋ง์ง๋ง ์นธ๊น์ง ๋๋ฌ ๊ฐ๋ฅํ ์นธ์ด ๋์จ๋ค๋ฉด, dp[i] = True & break |
| 26 | + if dp[i + di]: |
| 27 | + dp[i] = True |
| 28 | + break |
| 29 | + |
| 30 | + return dp[0] |
| 31 | + |
| 32 | + def canJump_greedy(self, nums: List[int]) -> bool: |
| 33 | + """ |
| 34 | + [Complexity] |
| 35 | + - TC: O(n) |
| 36 | + - SC: O(1) |
| 37 | +
|
| 38 | + [Approach] |
| 39 | + ์ผ์ชฝ idx๋ถํฐ ํ์ธํ๋ฉฐ, ํน์ idx์์ ์ค๋ฅธ์ชฝ ๋ฐฉํฅ์ผ๋ก ์ต๋ํ ๊ฐ ์ ์๋ max_step์ greedy ํ๊ฒ ํธ๋ํนํ๋ค. |
| 40 | + ์ด๋, ๋ค์ idx๋ก ๋์ด๊ฐ ๋๋ง๋ค ์ต๋ํ ๊ฐ ์ ์๋ max_step์์ -1์ ํด์ฃผ์ด์ผ ํ๋ฉฐ, |
| 41 | + ์ค๊ฐ์ max_step์ด ์์๊ฐ ๋๋ ๊ฒฝ์ฐ๋ผ๋ฉด ๋ง์ง๋ง idx๊น์ง ์งํํ ์ ์๋ ๊ฒ์ด๋ฏ๋ก False๋ฅผ ๋ฐํํ๋ค. |
| 42 | + """ |
| 43 | + max_step = 0 |
| 44 | + |
| 45 | + for n in nums: |
| 46 | + # max_step์ด ์์๊ฐ ๋๋ ๊ฒฝ์ฐ๋ผ๋ฉด, ๋ง์ง๋ง idx๊น์ง ์งํํ ์ ์์ |
| 47 | + if max_step < 0: |
| 48 | + return False |
| 49 | + |
| 50 | + # max_step ์
๋ฐ์ดํธ |
| 51 | + if max_step < n: |
| 52 | + max_step = n |
| 53 | + |
| 54 | + # ๋ค์ idx๋ก ๋์ด๊ฐ๊ธฐ ์ํด max_step-- |
| 55 | + max_step -= 1 |
| 56 | + |
| 57 | + return True |
| 58 | + |
| 59 | + def canJump(self, nums: List[int]) -> bool: |
| 60 | + """ |
| 61 | + [Complexity] |
| 62 | + - TC: O(n) |
| 63 | + - SC: O(1) |
| 64 | +
|
| 65 | + [Approach] |
| 66 | + ๋งจ ์ค๋ฅธ์ชฝ idx์ ๋๋ฌํ ์ ์๋ idx(= idx_can_reach_end)๋ฅผ ํธ๋ํนํจ์ผ๋ก์จ DP ํ์ด๋ฅผ optimize ํ ์ ์๋ค. |
| 67 | + nums์ ์ค๋ฅธ์ชฝ ์์๋ถํฐ ํ์ธํ๋ฉด์, i + nums[i]๊ฐ idx_can_reach_end ๋ณด๋ค gte ์ด๋ฉด |
| 68 | + **idx_can_reach_end๋ฅผ ๊ฑฐ์ณ์ ๋งจ ์ค๋ฅธ์ชฝ idx์ ๋๋ฌํ ์ ์๋ ๊ฒ**์ด๋ฏ๋ก idx_can_reach_end๋ฅผ i๋ก ์
๋ฐ์ดํธ ํ๋ค. |
| 69 | + ๋ชจ๋ ์ํ๊ฐ ๋๋๊ณ , idx_can_reach_end == 0์ธ์ง ์ฌ๋ถ๋ฅผ ๋ฐํํ๋ฉด ๋๋ค. |
| 70 | + """ |
| 71 | + n = len(nums) |
| 72 | + # ๋งจ ์ค๋ฅธ์ชฝ idx์ ๋๋ฌํ ์ ์๋ idx |
| 73 | + idx_can_reach_end = n - 1 |
| 74 | + |
| 75 | + # ์ค๋ฅธ์ชฝ์์๋ถํฐ ํ์ธ |
| 76 | + for i in range(n - 2, -1, -1): |
| 77 | + # ํ์ฌ idx์์ idx_can_reach_end๋ฅผ ๊ฑฐ์ณ์ ๋งจ ์ค๋ฅธ์ชฝ idx์ ๋๋ฌํ ์ ์๋ ๊ฒฝ์ฐ, idx_can_reach_end ์
๋ฐ์ดํธ |
| 78 | + if i + nums[i] >= idx_can_reach_end: |
| 79 | + idx_can_reach_end = i |
| 80 | + |
| 81 | + return idx_can_reach_end == 0 |
0 commit comments