Skip to content

Commit 7f4e8ad

Browse files
committed
word-search solution
1 parent 32e1e4c commit 7f4e8ad

File tree

1 file changed

+40
-27
lines changed

1 file changed

+40
-27
lines changed

word-search/sungjinwi.py

Lines changed: 40 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,47 @@
1+
"""
2+
풀이 :
3+
상하좌우 이동한 좌표가 board범위 벗어나면 False
4+
board[m][n]이 word[idx]와 불일치하면 False
5+
이미 방문했을경우 False
6+
단어가 완성되면 True
7+
상하좌우 한칸 이동한칸에 대해 재귀적 호출
8+
상하좌우 중 True 있으면 True 없으면 False
9+
10+
TC : O(M * N * 4 ^ W)
11+
board의 크기에 비례 -> M * N
12+
단어의 길이 만큼 상하좌우 재귀 호출 -> 4 ^ W
13+
14+
SC : O(M * N + W)
15+
set의 메모리는 board 크기에 비례 -> M * N
16+
함수 호출 스택은 단어 길이에 비례 -> W
17+
"""
18+
119
class Solution:
220
def exist(self, board: List[List[str]], word: str) -> bool:
3-
visit = {}
21+
visit = set()
22+
23+
def dfs(m: int, n: int, idx: int) -> bool:
24+
if not (0 <= m < row and 0 <= n < col):
25+
return False
26+
if not board[m][n] == word[idx]:
27+
return False
28+
if (m, n) in visit:
29+
return False
30+
if idx == len(word) - 1:
31+
return True
32+
33+
visit.add((m, n))
34+
if any (dfs(m + r, n + c, idx + 1) \
35+
for (r, c) in [(1, 0), (-1, 0), (0, 1), (0, -1)]):
36+
return True
37+
visit.remove((m, n))
38+
return False
39+
440
row = len(board)
541
col = len(board[0])
6-
7-
def dfs(m : int, n : int, seq : str) :
8-
if visit[m, n] :
9-
return
10-
if not word.startswith(seq + board[m][n]) :
11-
return
12-
visit[(m, n)] = 1
13-
seq += board[m][n]
14-
if seq == word :
15-
return
16-
if m > 0 :
17-
if (dfs()) :
18-
return True
19-
if down :
20-
dfs()
21-
if left :
22-
dfs()
23-
if right :
24-
dfs()
25-
visit(m, n) = 0
26-
seq = seq[:len(seq)-1]
27-
2842

29-
while m in range(row) :
30-
while n in range(col) :
31-
if dfs(m, n, "") :
43+
for m in range(row):
44+
for n in range(col):
45+
if dfs(m, n, 0):
3246
return True
33-
visit.clear()
3447
return False

0 commit comments

Comments
 (0)