알고리즘/백준

[백준] 2580번 스도쿠 (파이썬)

알감자 2021. 12. 29. 21:32
 

2580번: 스도쿠

스도쿠는 18세기 스위스 수학자가 만든 '라틴 사각형'이랑 퍼즐에서 유래한 것으로 현재 많은 인기를 누리고 있다. 이 게임은 아래 그림과 같이 가로, 세로 각각 9개씩 총 81개의 작은 칸으로 이루

www.acmicpc.net

 

 

코드

import sys

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

def sdoku(index):
    if index == len(zeros):
        for row in li:
            print(*row)
        sys.exit(0)
    else:
        x = zeros[index][0]
        y = zeros[index][1]
        dx = (x//3)*3
        dy = (y//3)*3

        num_list = [False] + [True for i in range(9)]

        for j in range(9):
            if (li[x][j]):
                num_list[li[x][j]] = False
            if (li[j][y]):
                num_list[li[j][y]] = False

        for i in range(dx,dx+3):
            for j in range(dy,dy+3):
                check_num = li[i][j]
                if check_num:
                    num_list[check_num] = False

        candidate_li = [i for i,k in enumerate(num_list) if k]

        for num in candidate_li:
            li[x][y] = num
            sdoku(index+1)
            li[x][y] = 0
sdoku(0)