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'LeetCode > Grind169' 카테고리의 다른 글
| 2. Add Two Numbers ☆★★ (0) | 2024.12.07 |
|---|---|
| 128. Longest Consecutive Sequence ☆★★★★★★★★★ (0) | 2024.12.03 |
| 55. Jump Game ★★★ (0) | 2024.11.26 |
| 189. Rotate Array ☆★★★★ (0) | 2024.11.26 |
| Medium - 328. Odd Even Linked List (0) | 2024.11.15 |