-
[75 LeetCode] 44 - Jump GameStudy/Leetcode 2023. 6. 10. 19:04
[75 LeetCode]는 코딩테스트 연습을 위해 한 페이스북 개발자가 추천하는 75가지 알고리즘 문제를 풀어보는 시리즈이다.
블라인드 원문:
https://www.teamblind.com/post/New-Year-Gift---Curated-List-of-Top-75-LeetCode-Questions-to-Save-Your-Time-OaM1orEU문제 링크: https://leetcode.com/problems/jump-game/
Jump Game - LeetCode
Can you solve this real interview question? Jump Game - You are given an integer array nums. You are initially positioned at the array's first index, and each element in the array represents your maximum jump length at that position. Return true if you can
leetcode.com
# 첫번째 아이디어
뒤에서 부터 시작하여 가장 멀리 닿을 수 있는 곳을 찾는다.
닿을 수 있는곳부터 다시 시작하여 찾기를 반복하여 0에 이르면 0 ~ 끝까지 닿을 수 있다는 것이 된다.var canJump = function(nums) { let idx = nums.length - 1; let curIdx = idx; while(idx > 0) { for(let i = idx - 1; i >= 0; i--) { // i번째 수의 크기가 idx - i 보다 크면 idx 까지 올 수 있다. if (nums[i] >= idx - i) { curIdx = i; } } // 찾은 curIdx가 없어서 curIdx === idx인 경우 0까지 갈 수 없다. if (curIdx === idx) return false; idx = curIdx; } return true; };
# 두번째 아이디어
dp[i] = i번만에 최종에 도착할 수 있는 가장 작은 인덱스
dp를 업데이트 하는 방법:
- i를 맨 뒤부터 앞으로 순회한다.
- 각 순회에서
- dp에 현재 인덱스에서 닿을 수 있는 곳이 있는지 조사한다.
- 있다면 그 인덱스의 dp를 업데이트해준다.
마지막에 dp에 0이 있다면 0에서 출발하여 최종에 이를 수 있다는 뜻이된다.var canJump = function(nums) { const dp = [nums.length - 1]; let dpIdx = 1; for(let i = nums.length - 2; i >= 0; i--) { for(let j = 0; j < dp.length; j++) { // 이전에는 모든 num에 대해 재순회하여 체크했다면, // dp를 이용하면서 같은 방식이지만 dp에 저장된 인덱스에 도착할 수 있는지만 // 매 순회에서 체크해주면 된다. if (dp[j] - i <= nums[i]) { dp[j + 1] = i; break; } } } return dp.includes(0); };
문제에 비해 너무 복잡하게 생각했던 것 같았다.
그리고 닿을 곳이 없는 경우에 대해 빠른 종료가 불가능했다.# 최종 아이디어 - 반복문으로 border를 체크하며 순회하기
`마지막 원소까지 가기 위해서는 border를 점점 확장하면서 닿을 수 있어야한다`
라는 생각이 들었다.
j를 순회하며 최대 border를 늘려나간다.
j가 border밖이라면 도달할 수 없으므로 false를 리턴.
끝까지 체크했다면 도달할 수 없는 부분이 없으므로 true를 리턴.var canJump = function(nums) { let border = 0 + nums[0]; for (let j = 0; j < nums.length; j++) { if (j > border) return false; border = Math.max(j + nums[j], border); } return true; };
성능을 위해 Math.max 호출 대신 if문과 newBorder 변수를 이용해주면 더 빠르다.
var canJump = function(nums) { let border = 0 + nums[0]; let newBorder = 0; for (let j = 0; j < nums.length; j++) { // 더 이상 닿을 수 있는 곳이 없다. if (j > border) return false; newBorder = j + nums[j]; if (border < newBorder) { border = newBorder; } } return true; };
728x90'Study > Leetcode' 카테고리의 다른 글
[75 LeetCode] 46 - Remove Nth Node From End of List (2) 2023.06.10 [75 LeetCode] 45 - Longest Consecutive Sequence (0) 2023.06.10 [75 LeetCode] 43 - Unique Path (0) 2023.05.30 [75 LeetCode] 42 - Decode Ways (0) 2023.05.28 [75 LeetCode] 41 - House Robber 2 (0) 2023.05.28