|
| 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