Skip to content

Commit c799db0

Browse files
committed
2문제 추가
1 parent cc1ca5e commit c799db0

File tree

2 files changed

+169
-0
lines changed

2 files changed

+169
-0
lines changed

set-matrix-zeroes/jdalma.kt

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
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 `set-matrix-zeroes` {
8+
9+
private data class Position(
10+
val x: Int,
11+
val y: Int
12+
)
13+
14+
fun setZeroes(matrix: Array<IntArray>): Unit {
15+
usingFlag(matrix)
16+
}
17+
18+
/**
19+
* 0으로 변경해야 할 열과 행을 Set에 담아 처리한다.
20+
* TC: O(n * m) SC: O(n + m)
21+
*/
22+
private fun usingSet(matrix: Array<IntArray>) {
23+
val zeroRows = mutableSetOf<Int>()
24+
val zeroCols = mutableSetOf<Int>()
25+
for (i in matrix.indices) {
26+
for (j in matrix.first().indices) {
27+
if (matrix[i][j] == 0) {
28+
zeroRows.add(i)
29+
zeroCols.add(j)
30+
}
31+
}
32+
}
33+
34+
for (row in zeroRows) {
35+
for (col in matrix.first().indices) {
36+
matrix[row][col] = 0
37+
}
38+
}
39+
40+
for (col in zeroCols) {
41+
for (row in matrix.indices) {
42+
matrix[row][col] = 0
43+
}
44+
}
45+
}
46+
47+
/**
48+
* 0으로 변경해야 할 열과 행을 matrix 0번째 행과 0번째 열 그리고 두 개의 flag로 처리하여 공간복잡도를 개선한다.
49+
* TC: O(n * m) SC: O(1)
50+
*/
51+
private fun usingFlag(matrix: Array<IntArray>) {
52+
var (rowFlag, colFlag) = false to false
53+
for (i in matrix.indices) {
54+
for (j in matrix.first().indices) {
55+
if (matrix[i][j] == 0) {
56+
if (i == 0) rowFlag = true
57+
if (j == 0) colFlag = true
58+
matrix[0][j] = 0
59+
matrix[i][0] = 0
60+
}
61+
}
62+
}
63+
64+
for (i in 1 until matrix.size) {
65+
for (j in 1 until matrix.first().size) {
66+
if (matrix[i][0] == 0 || matrix[0][j] == 0) {
67+
matrix[i][j] = 0
68+
}
69+
}
70+
}
71+
72+
if (rowFlag) {
73+
for (i in matrix.first().indices) {
74+
matrix[0][i] = 0
75+
}
76+
}
77+
78+
if (colFlag) {
79+
for (element in matrix) {
80+
element[0] = 0
81+
}
82+
}
83+
}
84+
85+
@Test
86+
fun `원소가 0이라면 해당 행과 열을 모두 0으로 수정한다`() {
87+
val actual1 = arrayOf(
88+
intArrayOf(1,1,1),
89+
intArrayOf(1,0,1),
90+
intArrayOf(1,1,1)
91+
)
92+
setZeroes(actual1)
93+
actual1 shouldBe arrayOf(
94+
intArrayOf(1,0,1),
95+
intArrayOf(0,0,0),
96+
intArrayOf(1,0,1)
97+
)
98+
99+
val actual2 = arrayOf(
100+
intArrayOf(0,1,2,0),
101+
intArrayOf(3,4,5,2),
102+
intArrayOf(1,3,1,5)
103+
)
104+
setZeroes(actual2)
105+
actual2 shouldBe arrayOf(
106+
intArrayOf(0,0,0,0),
107+
intArrayOf(0,4,5,0),
108+
intArrayOf(0,3,1,0)
109+
)
110+
}
111+
}

unique-paths/jdalma.kt

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package leetcode_study
2+
3+
import io.kotest.matchers.shouldBe
4+
import org.junit.jupiter.api.Test
5+
6+
/**
7+
* 0,0 에서 아래 또는 오른쪽으로만 이동 가능하다.
8+
*/
9+
class `unique-paths` {
10+
11+
fun uniquePaths(row: Int, col: Int): Int {
12+
return if (row <= 1 || col <= 1) 1
13+
else usingArray(row, col)
14+
}
15+
16+
/**
17+
* TC: O(n * m), SC: O(n * m)
18+
*/
19+
private fun usingGrid(row: Int, col: Int): Int {
20+
val grid = Array(row) { IntArray(col) }
21+
(0 until row).forEach { grid[it][0] = 1 }
22+
(0 until col).forEach { grid[0][it] = 1 }
23+
24+
for (i in 1 until row) {
25+
for (j in 1 until col) {
26+
grid[i][j] = grid[i - 1][j] + grid[i][j - 1]
27+
}
28+
}
29+
30+
return grid[row - 1][col - 1]
31+
}
32+
33+
/**
34+
* 이전 라인의 배열만 기억하여도 되므로 공간 복잡도를 아래와 같이 줄일 수 있다.
35+
* TC: O(n * m), SC: O(m)
36+
*/
37+
private fun usingArray(row: Int, col: Int): Int {
38+
var dp = IntArray(col)
39+
40+
for (i in 0 until row) {
41+
val tmp = IntArray(col)
42+
for (j in 0 until col) {
43+
if (i == 0 && j == 0) tmp[j] = 1
44+
else if (j > 0) tmp[j] = dp[j] + tmp[j - 1]
45+
else tmp[j] = dp[j]
46+
}
47+
dp = tmp
48+
}
49+
50+
return dp.last()
51+
}
52+
53+
@Test
54+
fun `왼쪽 상단 모서리에서 오른쪽 상단 모서리로 도달할 수 있는 고유 경로의 수를 반환한다`() {
55+
uniquePaths(3, 7) shouldBe 28
56+
uniquePaths(3, 2) shouldBe 3
57+
}
58+
}

0 commit comments

Comments
 (0)