바로 코드 구현을 알아보도록 하자
1 4 3 6 2 8 5 7 9
5 7 2 1 3 9 4 6 8
9 8 6 7 5 4 2 3 1
3 9 1 5 4 2 7 8 6
4 6 8 9 1 7 3 5 2
7 2 5 8 6 3 9 1 4
2 3 7 4 8 1 6 9 5
6 1 9 2 7 5 8 4 3
8 5 4 3 9 6 1 2 7
n = 9
root = int(n ** (1/2))
l = [list(map(int, input().split())) for _ in range(n)]
# 1. (3 x 3) 검증
# 인덱스만 가지고도 검증을 하는 코드를 구현합니다.
def checkChildListByIndex(l, index):
# 인덱스 하나만 가지고 3 x 3 크기의 2차원 배열을 만들어 주기 위해
# 다음과 같은 수식을 사용합니다.
# 2차원 배열의 시작 인덱스를 의미합니다
dx = index % root * root
dy = index // root % root * root
# 해당 인덱스에 맞는 자식(?) 2차원 배열을 전부 순회하며 값을 set 에 담아줍니다.
sudoku = set()
for i in range(dy, dy + root):
for j in range(dx, dx + root):
sudoku.add(l[i][j])
# 사이즈가 9일 경우 True
return len(sudoku) == n
# 전체 검증
def checkSudoku(l):
for i in range(n):
# 하나의 자식이라도
if not checkChildListByIndex(l, i):
return False
# 가로, 세로 검증
sudoku_v = sudoku_h = set()
for j in range(n):
sudoku_h.add(l[i][j])
sudoku_v.add(l[j][i])
if len(sudoku_v) != n or len(sudoku_v) != n:
return False
return True
print(checkSudoku(l))
True