자료구조&알고리즘

[Python] 백준 - 스도쿠 2850

두잇 두두 2024. 4. 2. 22:43
728x90

배경

https://www.acmicpc.net/problem/2580

 

2580번: 스도쿠

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

www.acmicpc.net

 

 

코드

def row(a, n):
    for i in range(9):
        if a == sudoku[n][i]:
            return False
    return True

def colum(a, n):
    for i in range(9):
        if a == sudoku[i][n]:
            return False
    return True

def square(x,y,a):
    for i in range(3):
        for j in range(3):
            if a == sudoku[y//3*3+i][x//3*3+j]:
                return False
    return True

def dfs(n):
    if n==len(blank):
        for i in sudoku:
            print(*i)
        exit()
    for i in range(1,10):
        y = blank[n][0]
        x = blank[n][1]
        if row(i, y) and colum(i, x) and square(x,y,i):
            sudoku[y][x]=i
            dfs(n+1)
            sudoku[y][x]=0


import sys
sudoku = [list(map(int,sys.stdin.readline().split())) for _ in range(9)]
blank = []
for i in range(9):
    for j in range(9):
        if sudoku[i][j] == 0:
            blank.append([i,j])
dfs(0)

 

 

설명

y가 먼저 나오는 이유는 2중 list의 경우 첫 번째 list가 보통 y값을 가르키기 때문입니다

리스트를 받고 스도쿠가 0인 값의 좌표를 받습니다.

해당 좌표의 가로 세로 대각선을 돌리면서 1~10까지의 숫자 중 가능한 숫자를 선택해서 넣습니다

 

 

배운 점