December 02, 2025
2D ๊ทธ๋ฆฌ๋์ ๋จ์ด๊ฐ ์ฃผ์ด์ง๋ฉด ๊ทธ ๋จ์ด๊ฐ ๊ทธ๋ฆฌ๋์ ์กด์ฌํ๋์ง ์ฌ๋ถ๋ฅผ ๋ฐํํ๋ ๋ฌธ์ ๋ค.
์ด ๋ฌธ์ ๋ ๋ฐฑํธ๋ํน(Backtracking) ๊ธฐ๋ฒ์ ์ฌ์ฉํ์ฌ ํด๊ฒฐํ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๋์์ ๋จ์ด๋ฅผ ์ฐพ๊ธฐ ์ํด ์ฌ๊ท์ ์ผ๋ก ํ์ํฉ๋๋ค.
ํต์ฌ: ๋ฐฑํธ๋ํน์ ํ๋ฉด์ ์ง๊ธ๊น์ง ์ฐพ์ ๋ฌธ์์ด์ด ๋จ์ด์ ์ ๋์ฌ(prefix)์ธ์ง ํ์ธํ๋ฉด์ ์ํํ๋ฉด ํจ๊ณผ์ ์ด๋ค. ์ด๋ฅผ ํ๊ธฐ ์ํด์๋ ๋ฐฉ๋ฌธํ ์์น, ์ขํ, ์ง๊ธ๊น์ง ์ฐพ์ ๋ฌธ์์ด ๋ฑ์ ๊ธฐ์ตํด์ผ ํ๋ค.
class Solution:
def exist(self, board: List[List[str]], word: str) -> bool:
def backtrack(x, y, path, visited):
if path != word[:len(path)]: #DNE
return False
if path == word: #found word
return True
for di,dj in [(-1,0),(1,0),(0,-1),(0,1)]: #search for word
ni,nj = x+di, y+dj
if 0<=ni<m and 0<=nj<n and (ni,nj) not in visited:
visited.add((ni,nj))
if backtrack(ni,nj,path+board[ni][nj], visited):
return True
visited.remove((ni,nj))
return False
m,n = len(board), len(board[0])
for i in range(m):
for j in range(n):
if board[i][j] != word[0]:
continue
found = backtrack(i,j,board[i][j],{(i,j)})
if found:
return True
return False
O(M * 3^L) ; M์ ๊ทธ๋ฆฌ๋์ ์
๊ฐ์, L์ ๋จ์ด์ ๊ธธ์ด์
๋๋ค. ๊ฐ ์
์์ ์์ํ์ฌ ์ต๋ L ๊ธธ์ด์ ๋จ์ด๋ฅผ ์ฐพ๊ธฐ ์ํด ์ต๋ 3๊ฐ์ง ๋ฐฉํฅ(์ํ์ข์ฐ ์ค ์ด์ ์์น ์ ์ธ)์ผ๋ก ํ์ํ ์ ์์ต๋๋ค.O(L) ; ์ฌ๊ท ํธ์ถ ์คํ๊ณผ ๋ฐฉ๋ฌธ ์งํฉ์ ์ฌ์ฉ๋๋ ๊ณต๊ฐ์
๋๋ค.Constraints:
m == board.length
n = board[i].length
1 <= m, n <= 6
1 <= word.length <= 15
board and word consists of only lowercase and uppercase English letters.