Skip to content

Commit 761d218

Browse files
committed
solve(w10): 55. Jump Game
1 parent f881e4a commit 761d218

File tree

1 file changed

+81
-0
lines changed

1 file changed

+81
-0
lines changed

โ€Žjump-game/seungriyou.pyโ€Ž

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
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

Comments
ย (0)