diff --git a/work/1/Medium/Array/36.valid-sudoku.py b/work/1/Medium/Array/36.valid-sudoku.py new file mode 100644 index 0000000..05f0ce3 --- /dev/null +++ b/work/1/Medium/Array/36.valid-sudoku.py @@ -0,0 +1,93 @@ +""" +36. Valid Sudoku +Difficulty: Medium +https://leetcode.com/problems/valid-sudoku/ + +────────────────────────────────────────────────── + +Determine if a 9 x 9 Sudoku board is valid. Only the filled cells +need to be validated according to the following rules: + + • Each row must contain the digits 1-9 without repetition. + + • Each column must contain the digits 1-9 without repetition. + +• Each of the nine 3 x 3 sub-boxes of the grid must contain the +digits 1-9 without repetition. + +Note: + +• A Sudoku board (partially filled) could be valid but is not +necessarily solvable. + +• Only the filled cells need to be validated according to the +mentioned rules. + + + +Example 1: + +Input: board = +[["5","3",".",".","7",".",".",".","."] +,["6",".",".","1","9","5",".",".","."] +,[".","9","8",".",".",".",".","6","."] +,["8",".",".",".","6",".",".",".","3"] +,["4",".",".","8",".","3",".",".","1"] +,["7",".",".",".","2",".",".",".","6"] +,[".","6",".",".",".",".","2","8","."] +,[".",".",".","4","1","9",".",".","5"] +,[".",".",".",".","8",".",".","7","9"]] +Output: true + +Example 2: + +Input: board = +[["8","3",".",".","7",".",".",".","."] +,["6",".",".","1","9","5",".",".","."] +,[".","9","8",".",".",".",".","6","."] +,["8",".",".",".","6",".",".",".","3"] +,["4",".",".","8",".","3",".",".","1"] +,["7",".",".",".","2",".",".",".","6"] +,[".","6",".",".",".",".","2","8","."] +,[".",".",".","4","1","9",".",".","5"] +,[".",".",".",".","8",".",".","7","9"]] +Output: false +Explanation: Same as Example 1, except with the 5 in the top left +corner being modified to 8. Since there are two 8's in the top left +3x3 sub-box, it is invalid. + + + +Constraints: + + • board.length == 9 + + • board[i].length == 9 + + • board[i][j] is a digit 1-9 or '.'. +""" + +import collections + + +class Solution: + def isValidSudoku(self, board: list[list[str]]) -> bool: + cols = collections.defaultdict(set) + rows = collections.defaultdict(set) + squares = collections.defaultdict(set) # (r/3, c/3) + + for r in range(9): + for c in range(9): + if board[r][c] == ".": + continue + 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 + cols[c].add(board[r][c]) + rows[r].add(board[r][c]) + squares[(r // 3, c // 3)].add(board[r][c]) + + return True