55. ์ ํ ๊ฒ์ ๐
์ง๋ฌธ
์ด ๊ธฐ์ฌ์์๋ Leetcode์ '55. Jump Game' ์ง๋ฌธ์ ๋ค๋ฃฐ ๊ฒ์ ๋๋ค. ์ด ์ง๋ฌธ์ ๊ณ ์ ์ ์ธ ๋ฌธ์ ์ ๋๋ค. ๊ด์ ์ ๋ฐ๋ผ Greedy Algorithm ๋ฌธ์ ๋๋ Dynamic Programming ๋ฌธ์ ์ ๋๋ค.
์๋ฌธ:
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.
Returntrue
if you can reach the last index, orfalse
otherwise.
Input: nums = [2,3,1,1,4]
Output: true
Explanation: Jump 1 step from index 0 to 1, then 3 steps to the last index.
์ง๋ฌธ ์ค๋ช
์ด ์ง๋ฌธ์ ๋ฑ๊ธ์ ๋ณดํต์ ๋๋ค. Greedy Algorithm ๊ธฐ์ ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ ํํ๋ค๊ณ ๋งํ ์ ์์ต๋๋ค. Dynamic Programming ๊ธฐ๋ฒ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ด ์ง๋ฌธ์ ์ด๋ ค์์ผ๋ก ๊ฐ์ฃผ๋ ์ ์์ต๋๋ค. ์ด ์ง๋ฌธ์์๋ Greedy Algorithm ๊ธฐ๋ฒ์ ์ฌ์ฉํฉ๋๋ค.
์ฐ๋ฆฌ๊ฐ ์์ฒญ๋ฐ์ ๊ฒ์ ์ธ๋ฑ์ค 0์์ ๋ฐฐ์ด์ ๋ง์ง๋ง ์ธ๋ฑ์ค๋ก ์ ํํ๋ ๊ฒ์ ๋๋ค. ์ฌ๊ธฐ์ ๊ฐ ์ธ๋ฑ์ค๋ ์ ํํ ์ ์๋ ๊ฑฐ๋ฆฌ๋ฅผ ๋ํ๋ ๋๋ค. ๋ฐ๋ผ์ ๊ฐ์ด 2์ธ ์ธ๋ฑ์ค์ ์๋ ๊ฒฝ์ฐ 2๊ฐ์ ์ธ๋ฑ์ค๋ฅผ ์์ผ๋ก ์ด๋ํ ์ ์์ต๋๋ค(๋๋ ์ํ๋ ๊ฒฝ์ฐ 1๊ฐ). ์ฒ์์๋ ์ด ๋ฌธ์ ๊ฐ ์ฌ์ํด ๋ณด์ด๊ณ Brute Force ๋ชจ๋ ๊ฒฝ๋ก๊ฐ ๋ง์ง๋ง ์์ธ์ ๋๋ฌํ๋ฉด ์๋ฃ๋ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ ๊ฑฐ์ ๊ทธ๋ํ ๋ฌธ์ ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฐ์ฅ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ ์๋๋๋ค. O(n^n) ์๊ฐ์ ๋๋ค. ๋งค์ฐ ๋๋ฆฝ๋๋ค.
๋์ , ์ฐ๋ฆฌ๋ Greedy์ผ๋ก ๊ฐ๊ณ ์ด O(n) ์๊ฐ์ ์ํํฉ๋๋ค.
๊ถ์ฅ ์ง์
์ฐ๋ฆฌ๋ ๋ฌด์์ ์๊ณ ์์ต๋๊น?
index
๋ ์ ํํ ์ ์๋ ๊ฑฐ๋ฆฌ๋ฅผ ๋ํ๋ด๋ฉฐ ๋ง์ง๋ง ์ธ๋ฑ์ค๋ก ์ ํํด์ผ ํฉ๋๋ค. ์ด๋ป๊ฒ ํ ๊ฒ์ธ๊ฐ:
์ฒ์์๋ '์ธ๋ฑ์ค 0๋ถํฐ ์์ํด์ ๋ง์ง๋ง ์ธ๋ฑ์ค์ ๋๋ฌํ ๋๊น์ง ๊ณ์ ์ ํํ๊ณ ์ ํจํ์ง ์์ ๊ฒฝ๋ก์์ ์ญ์ถ์ ํฉ๋๋ค.'๋ผ๊ณ ์๊ฐํ ์ ์์ต๋๋ค. ์ด๊ฒ์ Dynamic Programming๊ณผ Graph Problem์ด ๋งค์ฐ ์ ์ฌํ Backtracking ์๋ฃจ์ ์ธ Brute Force ์๋ฃจ์ ์ ๋๋ค.
๋์ ์ธ๋ฑ์ค 0์์ ์์ํ๋ ๋์ ๋ ผ๋ฆฌ๋ฅผ ๋ฐ๋๋ก ํ ๊ฒ์ ๋๋ค. ๋ง์ง๋ง ์ธ๋ฑ์ค์์ ์์ํ์ง ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ์ฒ์์๋ ๋ง์ง๋ง ์ธ๋ฑ์ค์ธ ๊ณจ ํฌ์คํธ๋ฅผ ๊ฐ๊ฒ ๋๋ฉฐ ๊ณจ ํฌ์คํธ์ ๋ชฉํ๋ ์ธ๋ฑ์ค 0์ ๋๋ฌํ๋ ๊ฒ์ ๋๋ค. '์ด ์์๊ฐ ๊ณจ ํฌ์คํธ๋ก ์ด๋ํ ์ ์์ต๋๊น?'๋ผ๊ณ ๋ฌป๋ ๋ฐฐ์ด์ ๊ฑฐ๊พธ๋ก ๋ฐ๋ณตํฉ๋๋ค. ๊ทธ๋ ๋ค๋ฉด ํด๋น ์์๋ ์ ํํ ์ ์๊ธฐ ๋๋ฌธ์ ์ ๊ณจ ํฌ์คํธ๊ฐ ๋ฉ๋๋ค. ์ฐ๋ฆฌ๋ ์ ์ฒด ๋ฐฐ์ด์ ์ดํด๋ณผ ๋๊น์ง ์ด ์์ ์ ๊ณ์ํฉ๋๋ค. ์ฒซ ๋ฒ์งธ ์ธ๋ฑ์ค์ ๋๋ฌํ๋ค๋ฉด ๋ง์ง๋ง ์ธ๋ฑ์ค๋ก ์ ํํ ์ ์๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด ์ ํํ ์ ์์ต๋๋ค.
๋น ์ค ํ๊ธฐ๋ฒ:
ํ์ด์ฌ ์๋ฃจ์
class Solution:
def canJump(self, nums: List[int]) -> bool:
goal_post = len(nums) - 1
for i in range(len(nums) - 2, -1, -1):
if i + nums[i] >= goal_post:
goal_post = i
return (goal_post == 0)
์๋ฐ ์๋ฃจ์
class Solution {
public boolean canJump(int[] nums) {
int goal_post = nums.length - 1;
for (int i = nums.length - 1; i >= 0; i--) {
int jump_distance = i + nums[i];
if (jump_distance >= goal_post) {
goal_post = i;
}
}
return (goal_post == 0) ? true : false;
}
}
C++ ์๋ฃจ์
class Solution {
public:
bool canJump(vector<int>& nums) {
int goal_post = nums.size() - 1;
for (int i = nums.size() - 1; i >= 0; i--) {
int jump_distance = i + nums[i];
if (jump_distance >= goal_post){
goal_post = i;
}
}
return (!goal_post) ? true : false;
}
};
์๋ฐ์คํฌ๋ฆฝํธ ์๋ฃจ์
/**
* @param {number[]} nums
* @return {boolean}
*/
var canJump = function (nums) {
let goal_post = nums.length - 1;
for (let i = nums.length - 1; i >= 0; i--) {
const jump_distance = i + nums[i];
if (jump_distance >= goal_post) {
goal_post = i;
}
}
return !goal_post ? true : false;
};
Reference
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(55. ์ ํ ๊ฒ์ ๐), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค
https://dev.to/samuelhinchliffe/55-jump-game-1pfb
ํ
์คํธ๋ฅผ ์์ ๋กญ๊ฒ ๊ณต์ ํ๊ฑฐ๋ ๋ณต์ฌํ ์ ์์ต๋๋ค.ํ์ง๋ง ์ด ๋ฌธ์์ URL์ ์ฐธ์กฐ URL๋ก ๋จ๊ฒจ ๋์ญ์์ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ
์ธ ๋ฐ๊ฒฌ์ ์ ๋
(Collection and Share based on the CC Protocol.)
class Solution:
def canJump(self, nums: List[int]) -> bool:
goal_post = len(nums) - 1
for i in range(len(nums) - 2, -1, -1):
if i + nums[i] >= goal_post:
goal_post = i
return (goal_post == 0)
class Solution {
public boolean canJump(int[] nums) {
int goal_post = nums.length - 1;
for (int i = nums.length - 1; i >= 0; i--) {
int jump_distance = i + nums[i];
if (jump_distance >= goal_post) {
goal_post = i;
}
}
return (goal_post == 0) ? true : false;
}
}
C++ ์๋ฃจ์
class Solution {
public:
bool canJump(vector<int>& nums) {
int goal_post = nums.size() - 1;
for (int i = nums.size() - 1; i >= 0; i--) {
int jump_distance = i + nums[i];
if (jump_distance >= goal_post){
goal_post = i;
}
}
return (!goal_post) ? true : false;
}
};
์๋ฐ์คํฌ๋ฆฝํธ ์๋ฃจ์
/**
* @param {number[]} nums
* @return {boolean}
*/
var canJump = function (nums) {
let goal_post = nums.length - 1;
for (let i = nums.length - 1; i >= 0; i--) {
const jump_distance = i + nums[i];
if (jump_distance >= goal_post) {
goal_post = i;
}
}
return !goal_post ? true : false;
};
Reference
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(55. ์ ํ ๊ฒ์ ๐), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค
https://dev.to/samuelhinchliffe/55-jump-game-1pfb
ํ
์คํธ๋ฅผ ์์ ๋กญ๊ฒ ๊ณต์ ํ๊ฑฐ๋ ๋ณต์ฌํ ์ ์์ต๋๋ค.ํ์ง๋ง ์ด ๋ฌธ์์ URL์ ์ฐธ์กฐ URL๋ก ๋จ๊ฒจ ๋์ญ์์ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ
์ธ ๋ฐ๊ฒฌ์ ์ ๋
(Collection and Share based on the CC Protocol.)
class Solution {
public:
bool canJump(vector<int>& nums) {
int goal_post = nums.size() - 1;
for (int i = nums.size() - 1; i >= 0; i--) {
int jump_distance = i + nums[i];
if (jump_distance >= goal_post){
goal_post = i;
}
}
return (!goal_post) ? true : false;
}
};
/**
* @param {number[]} nums
* @return {boolean}
*/
var canJump = function (nums) {
let goal_post = nums.length - 1;
for (let i = nums.length - 1; i >= 0; i--) {
const jump_distance = i + nums[i];
if (jump_distance >= goal_post) {
goal_post = i;
}
}
return !goal_post ? true : false;
};
Reference
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(55. ์ ํ ๊ฒ์ ๐), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://dev.to/samuelhinchliffe/55-jump-game-1pfbํ ์คํธ๋ฅผ ์์ ๋กญ๊ฒ ๊ณต์ ํ๊ฑฐ๋ ๋ณต์ฌํ ์ ์์ต๋๋ค.ํ์ง๋ง ์ด ๋ฌธ์์ URL์ ์ฐธ์กฐ URL๋ก ๋จ๊ฒจ ๋์ญ์์ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค