python3 불통과, pypy3 통과

# sdk = [[0, 3, 5, 4, 6, 9, 2, 7, 8],
#             [7, 8, 2, 1, 0, 5, 6, 0, 9],
#             [0, 6, 0, 2, 7, 8, 1, 3, 5],
#             [3, 2, 1, 0, 4, 6, 8, 9, 7],
#             [8, 0, 4, 9, 1, 3, 5, 0, 6],
#             [5, 9, 6, 8, 2, 0, 4, 1, 3],
#             [9, 1, 7, 6, 5, 2, 0, 8, 0],
#             [6, 0, 3, 7, 0, 1, 9, 5, 2],
#             [2, 5, 8, 3, 9, 4, 7, 6, 0]]

import sys

sdk = [list(map(int, input().split())) for _ in range(9)]
zeros = [(i, j) for i in range(9) for j in range(9) if sdk[i][j] == 0]

def sdoku(index):
    
    # 한 바퀴에서 모든 경우를 다 보았으면 출력
    if index == len(zeros):
        for row in sdk:
            print(*row)
        sys.exit(0)
    else:
        x = zeros[index][0]
        y = zeros[index][1]
        dx = (x//3) * 3
        dy = (y//3) * 3

        # 사용할 수 있는 숫자 9개
        num_list = [False] + [True for _ in range(9)]

        for j in range(9):
            # 가로 검사
            # 세로 검사
            if(sdk[x][j]):
                num_list[sdk[x][j]] = False       
            if(sdk[j][y]):
                num_list[sdk[j][y]] = False

        # 3*3 box 검사
        for i in range(dx, dx + 3):
            for j in range(dy, dy + 3):
                check_num = sdk[i][j]
                if(check_num):
                    num_list[check_num] = False

        # 현재 가능한 수만 가져옴
        # 가능한 수를 가져왔으면, 이전에 다뤄왔던 백트래킹을 사용하면 됨
        candidate_list = [i for i, k in enumerate(num_list) if k]
        
        # 경우의 수 고려
        for num in candidate_list:
            sdk[x][y] = num
            sdoku(index + 1)
            sdk[x][y] = 0
sdoku(0)

 

'# 코딩 문제 관련 > 파이썬' 카테고리의 다른 글

백준 14889번(python)  (0) 2020.01.02
백준 14888번(python)  (0) 2020.01.02
백준 9963번(python)  (0) 2019.12.31
백준 15652번(python)  (0) 2019.12.31
백준 15651번(python)  (6) 2019.12.31