Skip to content

Commit 3de3915

Browse files
committed
2문제 추가
1 parent 4b2878a commit 3de3915

File tree

2 files changed

+148
-0
lines changed

2 files changed

+148
-0
lines changed

merge-intervals/jdalma.kt

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
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 `merge-intervals` {
8+
9+
data class CustomRange(
10+
var start: Int,
11+
var end: Int
12+
) {
13+
fun isMergePossible(s: Int) = s <= this.end
14+
}
15+
16+
/**
17+
* TC: O(n log n), SC: O(n)
18+
*/
19+
fun merge(intervals: Array<IntArray>): Array<IntArray> {
20+
val sorted = intervals.sortedWith { i1, i2 -> i1[0].compareTo(i2[0]) }
21+
val result = mutableListOf<CustomRange>()
22+
23+
var tmp = sorted.first().let {
24+
CustomRange(it[0], it[1])
25+
}
26+
result.add(tmp)
27+
for (interval in sorted) {
28+
if (tmp.isMergePossible(interval[0])) {
29+
tmp.end = max(interval[1], tmp.end)
30+
} else {
31+
tmp = CustomRange(interval[0], interval[1])
32+
result.add(tmp)
33+
}
34+
}
35+
36+
return result.map { intArrayOf(it.start, it.end) }
37+
.toTypedArray()
38+
}
39+
40+
@Test
41+
fun `2차원 배열의 원소인 start와 end만큼 병합한 결과를 반환한다`() {
42+
merge(
43+
arrayOf(
44+
intArrayOf(2,6),
45+
intArrayOf(8,10),
46+
intArrayOf(15,18),
47+
intArrayOf(1,3)
48+
)
49+
) shouldBe arrayOf(
50+
intArrayOf(1,6),
51+
intArrayOf(8,10),
52+
intArrayOf(15,18)
53+
)
54+
55+
merge(
56+
arrayOf(
57+
intArrayOf(1,4),
58+
intArrayOf(0,4)
59+
)
60+
) shouldBe arrayOf(
61+
intArrayOf(0,4)
62+
)
63+
64+
merge(
65+
arrayOf(
66+
intArrayOf(1,4),
67+
intArrayOf(0,1)
68+
)
69+
) shouldBe arrayOf(
70+
intArrayOf(0,4)
71+
)
72+
}
73+
}

pacific-atlantic-water-flow/jdalma.kt

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package leetcode_study
2+
3+
import io.kotest.matchers.shouldBe
4+
import org.junit.jupiter.api.Test
5+
6+
class `pacific-atlantic-water-flow` {
7+
8+
private val dirs = listOf(
9+
intArrayOf(0, 1),
10+
intArrayOf(0, -1),
11+
intArrayOf(1, 0),
12+
intArrayOf(-1, 0)
13+
)
14+
15+
/**
16+
* TC: O(n * m), SC: O(n * m)
17+
*/
18+
fun pacificAtlantic(heights: Array<IntArray>): List<List<Int>> {
19+
val (row, col) = heights.size to heights.first().size
20+
val pacific = Array(row) { BooleanArray(col) }
21+
val atlantic = Array(row) { BooleanArray(col) }
22+
23+
for (index in 0 until row) {
24+
dfs(heights, pacific, Int.MIN_VALUE, index, 0)
25+
dfs(heights, atlantic, Int.MIN_VALUE, index, col - 1)
26+
}
27+
28+
for (index in 0 until col) {
29+
dfs(heights, pacific, Int.MIN_VALUE, 0, index)
30+
dfs(heights, atlantic, Int.MIN_VALUE, row - 1, index)
31+
}
32+
33+
val result = mutableListOf<List<Int>>()
34+
for (i in 0 until row) {
35+
for (j in 0 until col) {
36+
if (pacific[i][j] && atlantic[i][j]) {
37+
result.add(listOf(i, j))
38+
}
39+
}
40+
}
41+
return result
42+
}
43+
44+
private fun dfs(heights: Array<IntArray>, visited: Array<BooleanArray>, height: Int, r: Int, c: Int) {
45+
val (row, col) = heights.size to heights.first().size
46+
if (r < 0 || r >= row || c < 0 || c >= col || visited[r][c] || heights[r][c] < height)
47+
return
48+
49+
visited[r][c] = true
50+
for (dir in dirs) {
51+
dfs(heights, visited, heights[r][c], r + dir[0], c + dir[1])
52+
}
53+
}
54+
55+
@Test
56+
fun `태평양과 대서양에 모두 흐를 수 있는 셀의 위치를 반환하라`() {
57+
pacificAtlantic(
58+
arrayOf(
59+
intArrayOf(1,2,2,3,5),
60+
intArrayOf(3,2,3,4,4),
61+
intArrayOf(2,4,5,3,1),
62+
intArrayOf(6,7,1,4,5),
63+
intArrayOf(5,1,1,2,4)
64+
)
65+
) shouldBe arrayOf(
66+
intArrayOf(0,4),
67+
intArrayOf(1,3),
68+
intArrayOf(1,4),
69+
intArrayOf(2,2),
70+
intArrayOf(3,0),
71+
intArrayOf(3,1),
72+
intArrayOf(4,0)
73+
)
74+
}
75+
}

0 commit comments

Comments
 (0)