Skip to content

Commit b471b65

Browse files
authored
Merge pull request #488 from jdalma/main
[์ •ํ˜„์ค€] 7์ฃผ์ฐจ
2 parents 480e4b8 + c799db0 commit b471b65

File tree

5 files changed

+334
-0
lines changed

5 files changed

+334
-0
lines changed
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
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 `longest-substring-without-repeating-characters` {
8+
9+
fun lengthOfLongestSubstring(s: String): Int {
10+
if (s.length <= 1) return s.length
11+
return usingSet(s)
12+
}
13+
14+
/**
15+
* 1. ์‚ฌ์šฉํ•œ ๋ฌธ์ž๋ฅผ Set์— ์ €์žฅํ•˜์—ฌ ํ™•์ธํ•˜๊ณ , ์ค‘๋ณต๋œ๋‹ค๋ฉด ํ•ด๋‹น ๋ฌธ์ž์˜ ์œ„์น˜๊นŒ์ง€ ๋ชจ๋“  ๋ฌธ์ž๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค.
16+
* TC: O(n), SC: O(n)
17+
*/
18+
private fun usingSet(s: String): Int {
19+
var left = 0
20+
val used = mutableSetOf<Char>()
21+
var maxLength = 0
22+
23+
for (right in s.indices) {
24+
if (!used.contains(s[right])) {
25+
maxLength = max(right - left + 1, maxLength)
26+
used.add(s[right])
27+
} else {
28+
while (used.contains(s[right])) {
29+
used.remove(s[left])
30+
left++
31+
}
32+
used.add(s[right])
33+
}
34+
}
35+
36+
return maxLength
37+
}
38+
39+
@Test
40+
fun `์ž…๋ ฅ๋ฐ›์€ ๋ฌธ์ž์—ด์˜ ๋ฐ˜๋ณต๋˜๋Š” ๋ฌธ์ž๊ฐ€ ์—†๋Š” ๊ฐ€์žฅ ๊ธด ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค`() {
41+
lengthOfLongestSubstring("ababc") shouldBe 3
42+
lengthOfLongestSubstring("bbbbb") shouldBe 1
43+
lengthOfLongestSubstring("abcabcbb") shouldBe 3
44+
lengthOfLongestSubstring("pwwkew") shouldBe 3
45+
}
46+
}

โ€Žnumber-of-islands/jdalma.kt

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package leetcode_study
2+
3+
import io.kotest.matchers.shouldBe
4+
import org.junit.jupiter.api.Test
5+
6+
class `number-of-islands` {
7+
8+
private data class Position(
9+
val x: Int,
10+
val y: Int
11+
) {
12+
13+
operator fun plus(other: Position) = Position(this.x + other.x, this.y + other.y)
14+
15+
fun isNotOutOfIndexed(board: Array<CharArray>) =
16+
this.x < board.size && this.x >= 0 && this.y < board[0].size && this.y >= 0
17+
18+
companion object {
19+
val MOVES: List<Position> = listOf(
20+
Position(-1, 0),
21+
Position(0, 1),
22+
Position(1, 0),
23+
Position(0, -1),
24+
)
25+
}
26+
}
27+
28+
/**
29+
* BFS๋ฅผ ์‚ฌ์šฉํ•œ ํƒ์ƒ‰
30+
* TC: O(n * m), SC: O(n * m)
31+
*/
32+
fun numIslands(grid: Array<CharArray>): Int {
33+
val (row, col) = grid.size to grid.first().size
34+
val visited = Array(row) { BooleanArray(col) }
35+
var result = 0
36+
37+
for (x in 0 until row) {
38+
for (y in 0 until col) {
39+
if (!visited[x][y] && grid[x][y] == '1') {
40+
visited[x][y] = true
41+
bfs(x, y, grid, visited)
42+
result++
43+
}
44+
}
45+
}
46+
return result
47+
}
48+
49+
private fun bfs(x: Int, y: Int, grid: Array<CharArray>, visited: Array<BooleanArray>) {
50+
val queue = ArrayDeque<Position>().apply {
51+
this.add(Position(x, y))
52+
}
53+
54+
while (queue.isNotEmpty()) {
55+
val now = queue.removeFirst()
56+
for (move in Position.MOVES) {
57+
val moved = now + move
58+
if (moved.isNotOutOfIndexed(grid) && grid[moved.x][moved.y] == '1' && !visited[moved.x][moved.y]) {
59+
visited[moved.x][moved.y] = true
60+
queue.add(moved)
61+
}
62+
}
63+
}
64+
}
65+
66+
67+
@Test
68+
fun `๋ฌธ์ž ์ด์ฐจ์›๋ฐฐ์—ด์„ ์ž…๋ ฅ๋ฐ›์œผ๋ฉด 1๋กœ ์ด๋ฃจ์–ด์ง„ ์˜์—ญ์˜ ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค`() {
69+
numIslands(arrayOf(
70+
charArrayOf('1','1','1','1','0'),
71+
charArrayOf('1','1','0','1','0'),
72+
charArrayOf('1','1','0','0','0'),
73+
charArrayOf('0','0','0','0','0')
74+
)) shouldBe 1
75+
76+
numIslands(arrayOf(
77+
charArrayOf('1','1','0','0','0'),
78+
charArrayOf('1','1','0','0','0'),
79+
charArrayOf('0','0','1','0','0'),
80+
charArrayOf('0','0','0','1','1')
81+
)) shouldBe 3
82+
}
83+
}

โ€Žreverse-linked-list/jdalma.kt

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package leetcode_study
2+
3+
import io.kotest.matchers.shouldBe
4+
import org.junit.jupiter.api.Test
5+
6+
class `reverse-linked-list` {
7+
8+
/**
9+
* TC : O(n), SC: O(1)
10+
*/
11+
fun reverseList(head: ListNode?): ListNode? {
12+
var prev: ListNode? = null
13+
var next: ListNode? = null
14+
var curr: ListNode? = head
15+
16+
while (curr != null) {
17+
next = curr.next
18+
curr.next = prev
19+
prev = curr
20+
curr = next
21+
}
22+
23+
return prev
24+
}
25+
26+
@Test
27+
fun `์ž…๋ ฅ ๋ฐ›์€ ๋‹จ์ผ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ˜์ „ํ•˜๊ณ  ๋ฐ˜์ „ํ•œ ๋ชฉ๋ก์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค`() {
28+
reverseList(ListNode(1, ListNode(2, ListNode(3, ListNode(4, ListNode(5))))))
29+
shouldBe(ListNode(5, ListNode(4, ListNode(3, ListNode(2, ListNode(1))))))
30+
}
31+
}
32+
33+
class ListNode(
34+
var `val`: Int,
35+
var next: ListNode? = null
36+
)

โ€Ž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)