WordSearch

Published at 2021-12-06

class Solution:
    def exist(self, board: List[List[str]], word: str) -> bool:
        for i in range(len(board)):
            for j in range(len(board[0])):
                if self.checkWord(i, j, word, board):
                    return True
        return False

    def checkWord(self, i, j, word, board):
        if len(word) == 0: return True  # word가 다 없어질때까지 False를 안만났으면 True!
        if i < 0 or j < 0 or i > len(board) - 1 or j > len(board[0]) - 1: return False  # 범위 넘어가면 나가리

        if board[i][j] == word[0]:
            board[i][j] = '#'  # 방문으로 바꿈

            # result에 하나라도 True면 True반환할거
            if self.checkWord(i + 1, j, word[1:], board)                     or self.checkWord(i, j + 1, word[1:], board)                     or self.checkWord(i - 1, j, word[1:], board)                     or self.checkWord(i, j - 1, word[1:], board):
                return True

            board[i][j] = word[0]  # 얘를 수정한 상태 그대로 있으면 원본 값이 유지가 안되어서(sibal) 다시 되돌려줌

        return False
/**
 * @param {character[][]} board
 * @param {string} word
 * @return {boolean}
 */
var exist = function(board, word) {
    const checkWord=(i, j, word)=>{
        if(word.length == 0) {console.log(i, j,word, word.length);return true;}
        if(i<0 || i>=board.length || j<0 || j>=board[0].length || word[0]!==board[i][j]) return false;
        
        board[i][j] = '.';  // visited 처리
        if(checkWord(i, j+1, word.slice(1)) || checkWord(i+1, j, word.slice(1)) || checkWord(i, j-1, word.slice(1)) || checkWord(i-1, j, word.slice(1))){
            return true;
        }
        board[i][j] = word[0];
        
        return false;
    }
    
    
    for(let i=0; i<board.length; i++){
        for(let j=0; j<board[0].length; j++){
            if(checkWord(i, j, word)){
                return true;
            }
        }
    }
    
    return false;
};