Files
leetcode-study/repetition/dp/55.py
2026-10-13 16:03:52 +09:00

33 lines
1.5 KiB
Python

# Jump Game
class Solution:
def canJump(self, nums: list[int]) -> bool:
answer = True
max_idx = 0
now_idx = 0
if max_idx >= len(nums)-1:
return answer
while now_idx < len(nums) - 1 and now_idx <= max_idx:
max_idx = max(max_idx, now_idx + nums[now_idx])
if max_idx >= len(nums)-1:
break
now_idx += 1
else:
answer = False
return answer
"""
걸린 시간: 40분
복잡도: while문이지만 많아도 now_idx가 nums를 한번씩 다 확인하면 끝나기 때문에 시간복잡도는 O(n)이다.
변수 3개만 활용하기 때문에 공간복잡도는 O(1)이다.
해설: i번째에서 포함할 수 있는 미래의 좌표 최대값(max_idx)을 기록해둔 후, 그 최대값이 최종 인덱스를 넘는지 확인하면된다.
순회는 순서대로 하나의 인덱스씩 진행하며, 만약 max_idx를 현재 보는 인덱스가 초과했다면 미래 좌표의 범위가 끊겼다는 이야기이므로
그 좌표까지 도달하지 못한다는 말이므로 반복을 끝내고 False를 출력한다.
nums의 전체 길이가 1인 경우에는 반복문이 시작하자마자 끝나서 answer가 False가 되므로 예외처리 한다.
이 예외처리 때문에 과거에 풀었던 풀이가 훨씬 낫다. -> 거꾸로 오면서 최종 인덱스에 도달할 수 있는 이전 인덱스를 갱신하는데 이게 0이 되면 True
"""