36. Valid Sudoku

1. Description

  • 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.

2. Example

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.

3. Solution

  • Runtime: 0ms
  • ์„ค๋ช…
    • ์ด ๋ฌธ์ œ๋Š” ๋‚ด๊ฐ€ ๋ฅผ ๋„ˆ๋ฌด ์ƒ๊ฐํ•ด์„œ for๋ฌธ์„ ๋‘๋ฒˆ ๋Œ๋ฆฌ๋Š”๊ฑธ ์ƒ๊ฐ์„ ์•ˆํ•˜๊ณ  ํ’€๋ ค๊ณ  ํ–ˆ๋”๋‹ˆ ๋ชปํ’€์—ˆ๋‹ค.
    • ๋‹ต์ง€๋ฅผ ๋ณด๊ณ  ์ดํ•ดํ•˜๋ฉฐ Chat GPT๋ฅผ ๋ณด๊ณ  ์ฝ”๋“œ ๋ถ„์„์„ ์ง„ํ–‰ํ–ˆ๋‹ค.
    • ํ–‰(row), ์—ด(column), ๋ฐ•์Šค(box)๋ฅผ ์ €์žฅํ•  ์ž๋ฃŒ๊ตฌ์กฐ ์ƒ์„ฑํ•œ๋‹ค.
    • ์Šค๋„์ฟ  ๋ณด๋“œ์— .(๋นˆ ์นธ)์ด๋ฉด ๊ฑด๋„ˆ๋›ด๋‹ค.
    • if board[r][c] in rows[r] or board[r][c] in cols[c] or board[r][c] in boxes[(r //3, c//3)]:
      • ์ˆซ์ž๊ฐ€ ์ค‘๋ณต๋˜๋Š”์ง€ ๊ฒ€์‚ฌํ•œ๋‹ค.
    • ์ค‘๋ณต์ด ์•„๋‹ˆ๋ผ๋ฉด ์ˆซ์ž๋ฅผ ์ €์žฅํ•œ๋‹ค.
class Solution:
    def isValidSudoku(self, board: List[List[str]]) -> bool:
        rows = defaultdict(set)
        cols = defaultdict(set)
        boxes = defaultdict(set)
 
        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 boxes[(r //3, c//3)]:
                    return False
 
                rows[r].add(board[r][c])
                cols[c].add(board[r][c])
                boxes[(r // 3, c // 3)].add(board[r][c])
            
        return True
  • ๐Ÿ“Œdefaultdict๋ž€?
    • ๋ชจ๋“  Key์— ๋Œ€ํ•ด ๊ธฐ๋ณธ(default) ๊ฐ’์„ ์„ค์ •ํ•ด์ค€๋‹ค.
    • defaultdict(set)์ด๋ฉด
      • ๋”•์…”๋„ˆ๋ฆฌ Key๊ฐ’์„ set์„ default ๊ฐ’์œผ๋กœ ์ง€์ •ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
  • โœ๏ธ๋‚ด๊ฐ€ ์ดํ•ดํ•˜์ง€ ๋ชปํ–ˆ๋˜ ๋ถ€๋ถ„
    • ์ˆซ์ž ์ €์žฅ์ด ํ•„์š”ํ•œ ์ด์œ 
      • ์ค‘๋ณต๋˜๋Š” ์ˆซ์ž๊ฐ€ ์—†์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฏธ ๋“ฑ์žฅํ•œ ์ˆซ์ž๋ฅผ ์ €์žฅํ•˜์—ฌ ์ค‘๋ณต์ด ๋ฐœ์ƒํ•˜๋Š”์ง€ ๋น ๋ฅด๊ฒŒ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด set๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ™•์ธํ•œ๋‹ค.

4. What I Learned

References