Skip to content

Commit b1dfe9e

Browse files
committed
2문제 추가
1 parent e30a499 commit b1dfe9e

File tree

2 files changed

+133
-0
lines changed

2 files changed

+133
-0
lines changed

course-schedule/jdalma.kt

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
package leetcode_study
2+
3+
import io.kotest.matchers.shouldBe
4+
import org.junit.jupiter.api.Test
5+
6+
class `course-schedule` {
7+
8+
/**
9+
* TC: O(node + edge), SC: O(node + edge)
10+
*/
11+
fun canFinish(numCourses: Int, prerequisites: Array<IntArray>): Boolean {
12+
if (prerequisites.isEmpty()) return true
13+
14+
return usingTopologySort(numCourses, prerequisites)
15+
}
16+
17+
private fun usingTopologySort(numCourses: Int, prerequisites: Array<IntArray>): Boolean {
18+
val adj = List(numCourses) { mutableListOf<Int>() }
19+
val degree = IntArray(numCourses)
20+
for (e in prerequisites) {
21+
val (course, pre) = e[0] to e[1]
22+
adj[pre].add(course)
23+
degree[course]++
24+
}
25+
26+
val queue = ArrayDeque<Int>().apply {
27+
degree.forEachIndexed { index, i ->
28+
if (i == 0) {
29+
this.add(index)
30+
}
31+
}
32+
}
33+
34+
var answer = 0
35+
while (queue.isNotEmpty()) {
36+
val now = queue.removeFirst()
37+
answer++
38+
39+
queue.addAll(adj[now].filter { --degree[it] == 0 })
40+
}
41+
42+
return answer == numCourses
43+
}
44+
45+
@Test
46+
fun `코스의 개수와 코스 간 의존성을 전달하면 코스를 완료할 수 있는지 여부를 반환한다`() {
47+
canFinish(5,
48+
arrayOf(
49+
intArrayOf(0,1),
50+
intArrayOf(0,2),
51+
intArrayOf(1,3),
52+
intArrayOf(1,4),
53+
intArrayOf(3,4)
54+
)
55+
) shouldBe true
56+
canFinish(5,
57+
arrayOf(
58+
intArrayOf(1,4),
59+
intArrayOf(2,4),
60+
intArrayOf(3,1),
61+
intArrayOf(3,2)
62+
)
63+
) shouldBe true
64+
canFinish(2, arrayOf(intArrayOf(1, 0))) shouldBe true
65+
canFinish(2, arrayOf(intArrayOf(1, 0), intArrayOf(0, 1))) shouldBe false
66+
canFinish(20,
67+
arrayOf(
68+
intArrayOf(0,10),
69+
intArrayOf(3,18),
70+
intArrayOf(5,5),
71+
intArrayOf(6,11),
72+
intArrayOf(11,14),
73+
intArrayOf(13,1),
74+
intArrayOf(15,1),
75+
intArrayOf(17,4)
76+
)
77+
) shouldBe false
78+
}
79+
}

jump-game/jdalma.kt

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package leetcode_study
2+
3+
import io.kotest.matchers.shouldBe
4+
import org.junit.jupiter.api.Test
5+
import kotlin.math.max
6+
7+
class `jump-game` {
8+
9+
fun canJump(nums: IntArray): Boolean {
10+
return usingGreedy(nums)
11+
}
12+
13+
/**
14+
* TC: O(n), SC: O(1)
15+
*/
16+
private fun usingGreedy(nums: IntArray): Boolean {
17+
var reachable = 0
18+
for (index in nums.indices) {
19+
if (index > reachable) return false
20+
reachable = max(reachable, index + nums[index])
21+
}
22+
23+
return true
24+
}
25+
26+
/**
27+
* TC: O(n^2), SC: O(n)
28+
*/
29+
private fun usingMemoization(nums: IntArray): Boolean {
30+
val memo = IntArray(nums.size) { -1 }
31+
fun dfs(now: Int): Boolean {
32+
if (now >= nums.size - 1) {
33+
return true
34+
} else if (memo[now] != -1) {
35+
return memo[now] != 0
36+
}
37+
for (next in 1 .. nums[now]) {
38+
if (dfs(now + next)) {
39+
memo[now] = 1
40+
return true
41+
}
42+
}
43+
memo[now] = 0
44+
return false
45+
}
46+
return dfs(0)
47+
}
48+
49+
@Test
50+
fun `첫 번째 인덱스에서 마지막 인덱스에 도달할 수 있는지 여부를 반환한다`() {
51+
canJump(intArrayOf(2,3,1,1,4)) shouldBe true
52+
canJump(intArrayOf(3,2,1,0,4)) shouldBe false
53+
}
54+
}

0 commit comments

Comments
 (0)