문제
https://leetcode.com/problems/jump-game/description/?envType=study-plan-v2&envId=top-interview-150
LeetCode - The World's Leading Online Programming Learning Platform
Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.
leetcode.com
풀이
처음에 접근을 투포인터로 접근해보았다.
- 현재의 위치 = i
- 다음의 위치 = 현재 위치 + 현재 위치의 값 = j
위와 같이 설정한 뒤, 다음의 위치가 배열의 마지막 요소의 위치보다 크거나 같으면 True를 반환하고 그렇지 않으면 while 반복문 내부에서 조건을 설정하여 풀어보려고 했다.
하지만, 예외적인 상황이 많아서 코드가 복잡해지고 결국 해결하지 못했다. 투 포인터 말고 다른 방법을 시도해야겠다고 생각했다.
그래서 풀이를 참고하여 이해해보려고 노력했다.
def canJump(nums):
curr = nums[0]
for i in range(1, len(nums)):
if curr == 0:
return False
curr -= 1
curr = max(curr,nums[i])
return True
- 현재 최대 점프값을 유지하기 위해 변수에 저장한다.
- 현재 요소 다음 요소부터 모든 요소를 순회하면서 현재 최대 점프값에서 1을 뺀 값과 현재 인덱스의 요소값 중 큰 값을 curr 변수에 할당한다.
- 최대 점프값에서 1을 빼주는 이유는 반복문을 순회하면서 한칸 이동하는 것이 점프한 것으로 계산되기 때문이다.
- 그러므로 둘 중 큰 값을 curr 변수에 할당해주는 것이 현재 최대 점프값을 유지하는 방법이다.
- 1을 빼준 값과 현재 요소의 점프값이 curr 변수에 저장되다보면서 0인 요소가 등장하고 현재 최대 점프 값에서 1을 뺀 값이 0인 경우 curr 점프 최대값이 0이 된다.
- 마지막 요소 까지 순회하기 전에 curr 변수가 0이 되었다면 마지막 요소에 도달할 수 없다는 의미이므로 False를 반환한다.
- 마지막 요소 까지 모두 순회에 성공하면 True를 반환
'Leetcode' 카테고리의 다른 글
[Leetcode]_274. H-Index (0) | 2023.10.05 |
---|---|
[Leetcode]_45. Jump Game 2 (0) | 2023.09.26 |
[Leetcode]_122. Best Time to Buy and Sell Stock II (0) | 2023.09.22 |
[Leetcode]_121. Best Time to Buy and Sell Stock (0) | 2023.09.21 |
[Leetcode]_169. Majority Element (0) | 2023.09.18 |