1 분 소요

from collections import deque

class Solution(object):
    def exist(self, board, word):
        """
        :type board: List[List[str]]
        :type word: str
        :rtype: bool
        """
        
        q = deque()
        dy, dx = [1,-1,0,0], [0,0,1,-1]
        n, m = len(board), len(board[0])
        
        for i in range(n):
            for j in range(m):
                if board[i][j] == word[0]:
                    visited_set = set()
                    visited_set.add((i, j))
                    q.append([i,j,visited_set])
        
        if len(q) == 0: # we can't start
            return False
        
        if len(word) == 1: # do not have to check word
            return True

        while q:
            y, x, visited_set = q.popleft()

            for i in range(4):
                ny, nx = y+dy[i], x+dx[i]
                if (0 <= ny < n and 0 <= nx < m) and (ny, nx) not in visited_set and board[ny][nx] == word[len(visited_set)]:
                    if len(visited_set)+1 == len(word):
                        return True
                    next_visited_set = visited_set.copy()
                    next_visited_set.add((ny, nx))
                    q.append([ny, nx, next_visited_set])
        
        return False

class TrieNode:
    def __init__(self):
        self.children = {}
        self.isWord = False
        self.word = None
        
class Solution(object):
    def findWords(self, board, words):
        # Trie 구축
        root = TrieNode()
        for word in words:
            node = root
            for char in word:
                if char not in node.children:
                    node.children[char] = TrieNode()
                node = node.children[char]
            node.isWord = True
            node.word = word
            
        rows, cols = len(board), len(board[0])
        result = set()
        
        def dfs(row, col, node):
            # 현재 위치의 문자 저장
            char = board[row][col]
            curr = node.children.get(char)
            
            # 현재 노드가 없으면 반환
            if not curr:
                return
            
            # 단어를 찾았다면 결과에 추가
            if curr.isWord:
                result.add(curr.word)
                
            # 현재 셀 방문 표시
            board[row][col] = '#'
            
            # 4방향 탐색
            for dx, dy in [(0,1), (1,0), (0,-1), (-1,0)]:
                new_row, new_col = row + dx, col + dy
                if 0 <= new_row < rows and 0 <= new_col < cols and board[new_row][new_col] != '#':
                    dfs(new_row, new_col, curr)
                    
            # 방문 표시 복원
            board[row][col] = char
        
        # 보드의 모든 위치에서 DFS 시작
        for i in range(rows):
            for j in range(cols):
                dfs(i, j, root)
                
        return list(result)

업데이트:

댓글남기기