-
Notifications
You must be signed in to change notification settings - Fork 2
/
Jump Game.kt
68 lines (55 loc) · 1.84 KB
/
Jump Game.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
/* https://leetcode.com/problems/jump-game/ */
/**
* 완전 탐색, 그리디, 재귀
* 1번 코드
*/
class Solution {
// 탐색해봤다는 건 그 위치에서는 도달할 수 없다는 뜻
lateinit var visited: BooleanArray
fun canJump(nums: IntArray): Boolean {
return when{
nums.size > 1 && nums[0] == 0 -> false
nums[0] == 0 -> true
else -> {
visited = BooleanArray(nums.size)
isReachable(nums, 0)
}
}
}
private fun isReachable(nums: IntArray, index: Int): Boolean {
if (index >= nums.lastIndex) return true // 성공 조건 종료
if (visited[index]) return false
visited[index] = true
// 최대 길이 ~ 1까지 전부 점프해본다
for (distance in nums[index] downTo 1) {
if(isReachable(nums, index + distance)) {
return true
}
}
// for문에서 전부 탐색했는데 true가 반환되지 않았으면
// 지금 위치에서 끝에 도달할 수 없다
return false
}
}
/**
* 2번 코드
* 완전 탐색, 그리디
*/
import kotlin.math.max
class Solution {
fun canJump(nums: IntArray): Boolean {
var maxReach = 0
// 매 위치마다 최대로 점프한다.
// 0에 수렴한다면 0을 넘어서지 못한다는 뜻이다.
// 최대보다 덜 점프하면 0보다 앞에 도착하고,
// 최대로 점프하면 0으로 수렴하기 때문이다.
for (i in nums.indices) {
if (maxReach < i) break
if (maxReach >= nums.lastIndex) {
return true
}
maxReach = max(maxReach, i + nums[i])
}
return false
}
}