|
| 1 | +package leetcode_study |
| 2 | + |
| 3 | + |
| 4 | +/* |
| 5 | +* dfs로 문제 해결 |
| 6 | +* 정해진 순서의 단어를 처리하는 부분에서 대부분의 시간 사용 |
| 7 | +* 시간 복잡도: O(m *n) |
| 8 | +* -> 주어진 배열에서 첫 번째 글자를 찾는 반복문: O(m *n) |
| 9 | +* -> 최악의 경우 모든 칸을 방문 처리(dfs): O(m *n) |
| 10 | +* --> O(m *n) + O(m *n) == O(m *n) |
| 11 | +* 공간 복잡도: O(m *n) |
| 12 | +* -> 재귀 호출 스택 공간 dfs 함수에서 최악의 경우 필요한 스택 공간: O(m *n) |
| 13 | +* */ |
| 14 | +val dx = listOf(0, 1, -1, 0) |
| 15 | +val dy = listOf(1, 0, 0, -1) |
| 16 | + |
| 17 | +fun exist(board: Array<CharArray>, word: String): Boolean { |
| 18 | + val rowSize = board.size |
| 19 | + val colSize = board[0].size |
| 20 | + val visited = Array(rowSize) { BooleanArray(colSize) } |
| 21 | + |
| 22 | + // 모든 위치에서 DFS 탐색 시작 |
| 23 | + for (i in board.indices) { |
| 24 | + for (j in board[0].indices) { |
| 25 | + if (board[i][j] == word[0] && dfs(board, word, i, j, 0, visited)) { |
| 26 | + return true |
| 27 | + } |
| 28 | + } |
| 29 | + } |
| 30 | + return false |
| 31 | +} |
| 32 | + |
| 33 | +fun dfs(board: Array<CharArray>, word: String, x: Int, y: Int, index: Int, visited: Array<BooleanArray>): Boolean { |
| 34 | + // 탐색 종료 조건 |
| 35 | + if (index == word.length) return true |
| 36 | + if (x !in board.indices || y !in board[0].indices || visited[x][y] || board[x][y] != word[index]) return false |
| 37 | + |
| 38 | + // 현재 위치 방문 처리 |
| 39 | + visited[x][y] = true |
| 40 | + |
| 41 | + // 4방향으로 탐색 |
| 42 | + for (i in 0..3) { |
| 43 | + val nx = x + dx[i] |
| 44 | + val ny = y + dy[i] |
| 45 | + if (dfs(board, word, nx, ny, index + 1, visited)) { |
| 46 | + return true |
| 47 | + } |
| 48 | + } |
| 49 | + |
| 50 | + // 방문 복구 |
| 51 | + visited[x][y] = false |
| 52 | + return false |
| 53 | +} |
0 commit comments