Skip to content

Commit aa83d96

Browse files
author
이연수
committed
word search
1 parent f56cf9e commit aa83d96

File tree

1 file changed

+53
-0
lines changed

1 file changed

+53
-0
lines changed

word-search/EcoFriendlyAppleSu.kt

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
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

Comments
 (0)