본문 바로가기
Algorithm/BOJ

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

by _temp 2022. 1. 24.

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

# 스도쿠
import sys
input = sys.stdin.readline
N = 9
arr = []
zero = []
for i in range(N):
    arr.append(list(map(int, input().split())))
    for j in range(N):
        if arr[i][j] == 0:
            zero.append((i, j))


def check(x, y, num):
    for j in range(N):
        if arr[x][j] == num:
            return False
    for i in range(N):
        if arr[i][y] == num:
            return False
    temp_x = x // 3 * 3
    temp_y = y // 3 * 3
    for i in range(temp_x, temp_x+3):
        for j in range(temp_y, temp_y+3):
            if arr[i][j] == num:
                return False
    return True


def push_num(count):
    global isDone
    if count == len(zero):
        isDone = True
        return
    x = zero[count][0]
    y = zero[count][1]
    for n in range(1, 10):
        if check(x, y, n):
            arr[x][y] = n
            push_num(count+1)
            if isDone:
                return
            arr[x][y] = 0


isDone = False
push_num(0)
for i in range(N):
    print(*arr[i])

 

백트랙킹

1. 입력 받을 때 0인 좌표를 zero리스트에 따로 append한다.

2. 1~9까지 가로, 세로, 구역 체크가 된 숫자를 zero리스트 좌표의 arr에 넣는다

3. zero리스트의 좌표에 전부 값을 넣었으면 retrun

4. 출력