< All posts

79. Word Search

๋ฌธ์ œ ์„ค๋ช…

2D ๊ทธ๋ฆฌ๋“œ์™€ ๋‹จ์–ด๊ฐ€ ์ฃผ์–ด์ง€๋ฉด ๊ทธ ๋‹จ์–ด๊ฐ€ ๊ทธ๋ฆฌ๋“œ์— ์กด์žฌํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฌธ์ œ๋‹ค.

79

ํ’€์ด ๋ฐ ํ•ด์„ค

์ด ๋ฌธ์ œ๋Š” ๋ฐฑํŠธ๋ž˜ํ‚น(Backtracking) ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๋“œ์—์„œ ๋‹จ์–ด๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ์žฌ๊ท€์ ์œผ๋กœ ํƒ์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.

  • ๋ฐฑํŠธ๋ž˜ํ‚น ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜์—ฌ ์žฌ๊ท€์ ์œผ๋กœ ๊ทธ๋ฆฌ๋“œ์—์„œ ๋‹จ์–ด๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.
  • ๊ธฐ๋ณธ ์‚ฌ๋ก€๋กœ, ํ˜„์žฌ ์ธ๋ฑ์Šค๊ฐ€ ๋‹จ์–ด์˜ ๊ธธ์ด์™€ ๊ฐ™์•„์ง€๋ฉด ๋‹จ์–ด๋ฅผ ์ฐพ์•˜์œผ๋ฏ€๋กœ True๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • ์žฌ๊ท€ ๋‹จ๊ณ„์—์„œ๋Š” ํ˜„์žฌ ์œ„์น˜๊ฐ€ ๊ทธ๋ฆฌ๋“œ์˜ ๊ฒฝ๊ณ„๋ฅผ ๋ฒ—์–ด๋‚˜์ง€ ์•Š๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ํ˜„์žฌ ๊ทธ๋ฆฌ๋“œ ๋ฌธ์ž๊ฐ€ ๋‹จ์–ด์˜ ํ˜„์žฌ ๋ฌธ์ž์™€ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ผ์น˜ํ•˜๋ฉด ํ•ด๋‹น ์œ„์น˜๋ฅผ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌํ•˜๊ณ  ์ƒํ•˜์ขŒ์šฐ๋กœ ์ด๋™ํ•˜์—ฌ ๋‹ค์Œ ๋ฌธ์ž๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.
  • ์ตœ์ข…์ ์œผ๋กœ ๋‹จ์–ด๋ฅผ ์ฐพ์•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

ํ•ต์‹ฌ: ๋ฐฑํŠธ๋ž˜ํ‚น์„ ํ•˜๋ฉด์„œ ์ง€๊ธˆ๊นŒ์ง€ ์ฐพ์€ ๋ฌธ์ž์—ด์ด ๋‹จ์–ด์˜ ์ ‘๋‘์‚ฌ(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

๋ณต์žก๋„

c

์‹œ๊ฐ„๋ณต์žก๋„

  • O(M * 3^L) ; M์€ ๊ทธ๋ฆฌ๋“œ์˜ ์…€ ๊ฐœ์ˆ˜, L์€ ๋‹จ์–ด์˜ ๊ธธ์ด์ž…๋‹ˆ๋‹ค. ๊ฐ ์…€์—์„œ ์‹œ์ž‘ํ•˜์—ฌ ์ตœ๋Œ€ L ๊ธธ์ด์˜ ๋‹จ์–ด๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ์ตœ๋Œ€ 3๊ฐ€์ง€ ๋ฐฉํ–ฅ(์ƒํ•˜์ขŒ์šฐ ์ค‘ ์ด์ „ ์œ„์น˜ ์ œ์™ธ)์œผ๋กœ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ณต๊ฐ„๋ณต์žก๋„

  • O(L) ; ์žฌ๊ท€ ํ˜ธ์ถœ ์Šคํƒ๊ณผ ๋ฐฉ๋ฌธ ์ง‘ํ•ฉ์— ์‚ฌ์šฉ๋˜๋Š” ๊ณต๊ฐ„์ž…๋‹ˆ๋‹ค.

Constraint Analysis

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.

References

ยฉ 2025 HyunJoon Sung. All Rights Reserved.

GitHub