LeetCode/Grind169

[Top150] 36. Valid Sudoku ★★★

hyunkookim 2024. 11. 30. 16:09

36. Valid Sudoku

 

https://youtu.be/TjFXEUCMqI8?si=mfzpl_jlRUHMsnOR

 

from typing import List
import collections

class Solution:
    def isValidSudoku(self, board: List[List[str]]) -> bool:
        # 각 열에 있는 숫자를 추적하기 위한 딕셔너리 (기본값은 set)
        cols = collections.defaultdict(set)
        # 각 행에 있는 숫자를 추적하기 위한 딕셔너리 (기본값은 set)
        rows = collections.defaultdict(set)
        # 각 3x3 서브그리드에 있는 숫자를 추적하기 위한 딕셔너리 (기본값은 set)
        # key는 (r//3, c//3) 형태로, 서브그리드를 고유하게 식별
        squares = collections.defaultdict(set)
        
        # 보드의 모든 행(r)과 열(c)을 순회
        for r in range(9):
            for c in range(9):
                # 빈 칸('.')은 검사할 필요가 없으므로 건너뜀
                if board[r][c] == ".":
                    continue
                
                # 현재 숫자가 이미 같은 행, 열, 또는 3x3 서브그리드에 있는지 확인
                if (board[r][c] in rows[r] or 
                    board[r][c] in cols[c] or 
                    board[r][c] in squares[(r // 3, c // 3)]):
                    return False  # 규칙 위반 시 False 반환
                
                # 현재 숫자를 해당 행, 열, 서브그리드의 집합에 추가
                cols[c].add(board[r][c])
                rows[r].add(board[r][c])
                squares[(r // 3, c // 3)].add(board[r][c])
        
        # 모든 숫자가 규칙을 만족하면 True 반환
        return True

 

class Solution:
    def isValidSudoku(self, board: List[List[str]]) -> bool:
        # 가로, 세로, 3x3 셀에서 중복되는 값이 없어야
        rows = defaultdict(set)
        cols = defaultdict(set)
        cells = defaultdict(set)

        for r in range(len(board)):
            for c in range(len(board[0])):
                if board[r][c] != ".":
                    val = board[r][c]
                    if val in rows[r] or val in cols[c] or val in cells[(r//3, c//3)]:
                        return False
                    rows[r].add(val)
                    cols[c].add(val)
                    cells[(r//3, c//3)].add(val)
                    
        return True