[파이썬] 스도쿠 검증하는 코드 (간단)

최대한·2021년 8월 25일
0

서론

바로 코드 구현을 알아보도록 하자

본론

1. Input

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

2. Code

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))

3. Output

True

profile
Awesome Dev!

0개의 댓글