Minesweeper

Published at 2022-11-23

class Solution:
    def updateBoard(self, board: List[List[str]], click: List[int]) -> List[List[str]]:
        '''
        [case1. 지뢰 클릭]
        클릭한 곳 X로 변경하고 끝
        
        [case2. 지뢰 외 클릭]
        다음다음칸이 지뢰면
        지뢰 만나면 주변에 1씩 추가해야 되는데
        '''
        def dfs(board, i, j):
            if board[i][j] != 'E':  # 이미 체크한 칸이면 E가 아닐거임
                return
            
            m, n = len(board), len(board[0])
            directions = [(-1,0), (-1,1), (0,1), (1,1), (1,0), (1,-1), (0,-1), (-1,-1)]
            mine_cnt = 0
            
            for d in directions:
                next_i, next_j = i+d[0], j+d[1]
                if 0 <= next_i < m and 0 <= next_j < n and board[next_i][next_j] == 'M':  # 다음칸이 지뢰면 숫자 올리고 멈춰야 함
                    mine_cnt += 1
            
            if mine_cnt > 0:
                board[i][j] = str(mine_cnt)  # 다음칸이 지뢰면 지뢰 몇갠지 기록하고 스탑
                return
            
            board[i][j] = 'B'  # 지뢰 없으면 빈칸으로 칸 오픈
            
            for d in directions:
                next_i, next_j = i+d[0], j+d[1]
                if 0 <= next_i < m and 0 <= next_j < n:
                    dfs(board, next_i, next_j)
        
        
        
        if board[click[0]][click[1]] == 'M':
            board[click[0]][click[1]] = 'X'
            return board  # 지뢰 클릭시 얼리리턴
        else:
            dfs(board, click[0], click[1])
            return board