Skip to content

Commit fc19c82

Browse files
committed
Add word search solution
1 parent 82c01f1 commit fc19c82

File tree

1 file changed

+39
-0
lines changed

1 file changed

+39
-0
lines changed

โ€Žword-search/hyunjung-choi.kt

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/*
2+
* ์‹œ๊ฐ„ ๋ณต์žก๋„ (R=ํ–‰, C=์—ด, N=R*C, L=word.length)
3+
* - ๋ชจ๋“  ์นธ(N๊ฐœ)์—์„œ ์‹œ์ž‘ ๊ฐ€๋Šฅ.
4+
* - DFS ํ•œ ๋‹จ๊ณ„์—์„œ ์ตœ๋Œ€ 4๋ฐฉํ–ฅ, ๋‹ค์Œ ๋‹จ๊ณ„๋ถ€ํ„ฐ๋Š” ๋˜๋Œ์•„๊ฐˆ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์ตœ๋Œ€ 3๋ฐฉํ–ฅ์œผ๋กœ ๋ถ„๊ธฐ.
5+
* - ์ตœ์•…: N * (4 * 3^(L-1)) = O(R*C*3^L).
6+
*
7+
* ๊ณต๊ฐ„ ๋ณต์žก๋„
8+
* - visited ๋ฐฐ์—ด: O(R*C)
9+
* - ์žฌ๊ท€ ์ฝœ์Šคํƒ: ๊ฒฝ๋กœ ๊ธธ์ด ์ตœ๋Œ€ L โ†’ O(L)
10+
* - ์ดํ•ฉ: O(R*C + L) (์ตœ์•… ๊ธฐ์ค€์€ O(R*C))
11+
*/
12+
13+
class Solution {
14+
fun exist(board: Array<CharArray>, word: String): Boolean {
15+
if (word.isEmpty()) return true
16+
17+
val rows = board.size
18+
val cols = board.firstOrNull()?.size ?: return false
19+
val visited = Array(rows) { BooleanArray(cols) }
20+
val directions = arrayOf(1 to 0, -1 to 0, 0 to 1, 0 to -1)
21+
22+
fun dfs(r: Int, c: Int, index: Int): Boolean {
23+
if (index == word.length) return true
24+
if (r !in 0 until rows || c !in 0 until cols) return false
25+
if (visited[r][c] || board[r][c] != word[index]) return false
26+
27+
visited[r][c] = true
28+
val found = directions.any { (dr, dc) -> dfs(r + dr, c + dc, index + 1) }
29+
visited[r][c] = false
30+
return found
31+
}
32+
33+
return board.indices.any { r ->
34+
board[0].indices.any { c ->
35+
board[r][c] == word[0] && dfs(r, c, 0)
36+
}
37+
}
38+
}
39+
}

0 commit comments

Comments
ย (0)