작심삼일

[LeetCode] 36 | Valid Sudoku | Python 본문

스터디/코테

[LeetCode] 36 | Valid Sudoku | Python

yun_s 2022. 11. 23. 09:09
728x90
반응형

문제 링크: 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:

  1. Each row must contain the digits 1-9 without repetition.
  2. Each column must contain the digits 1-9 without repetition.
  3. 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.

조건

  • board.length == 9
  • board[i].length == 9
  • board[i][j] is a digit 1-9 or '.'.

내 풀이

처음에는 문제에서 주어진 스도쿠를 풀어야 하는 줄 알고 식겁했다.

하지만 현재 주어진 숫자들만 가지고 푸는 것이었다. (예를 들면, 예제 2번에서는 이미 첫번째 열에 8이 두번 나오므로 스도쿠가 성립하지 않는다.)

따라서 각 행, 열, 그리고 $3 \times 3$ 사각형별로 1~9의 숫자가 중복되는 지 확인하면 된다.


코드

class Solution:
    def isValidSudoku(self, board: List[List[str]]) -> bool:
        rows = defaultdict(set)
        cols = defaultdict(set)
        squares = defaultdict(set)
        
        for h in range(9):
            for w in range(9):
                if board[h][w] == '.':
                    continue
                
                if board[h][w] in rows[h] or board[h][w] in cols[w] or board[h][w] in squares[(h//3, w//3)]:
                    return False
                
                rows[h].add(board[h][w])
                cols[w].add(board[h][w])
                squares[(h//3, w//3)].add(board[h][w])
                
        return True
728x90
반응형
Comments