import sys
input = sys.stdin.readline
def check_sdouk(x,y):
index_set = set(range(1,10))
occupy_set = set()
for checky in range(9):
if sdoku[x][checky]:
occupy_set.add(sdoku[x][checky])
for checkx in range(9):
if sdoku[checkx][y]:
occupy_set.add(sdoku[checkx][y])
squarex = x//3*3
squarey = y//3*3
for checkx in range(squarex,squarex+3):
for checky in range(squarey,squarey+3):
if sdoku[checkx][checky]:
occupy_set.add(sdoku[checkx][checky])
return index_set-occupy_set
def sdoku_input(cnt):
global check_max,result
if cnt == check_max:
result = [row[:] for row in sdoku]
for row in result:
print(*row)
sys.exit()
return
else:
a = check_sdouk(*check_list[cnt])
if a:
for number in a:
sdoku[check_list[cnt][0]][check_list[cnt][1]] = number
sdoku_input(cnt+1)
sdoku[check_list[cnt][0]][check_list[cnt][1]] = 0
else:
return
sdoku = []
check_list = []
for x in range(9):
input_list = list(map(int,input().split()))
for y in range(9):
if not input_list[y]:
check_list.append((x,y))
sdoku.append(input_list)
result = []
check_max = len(check_list)
sdoku_input(0)
재귀를 이용해서 풀었다.
sys.exit()를 통해 최초의 결과가 나오면 바로 나오게 해줬다.
import sys
input = sys.stdin.readline
def check(cnt):
if cnt == len(check_list):
for row in sdoku:
print(*row)
sys.exit()
else:
x,y = check_list[cnt]
square_ind = x//3*3 + y//3
for number in range(1,10):
if row_index[x][number] + col_index[y][number] + square_index[square_ind][number] == 0:
row_index[x][number] = 1
col_index[y][number] = 1
square_index[square_ind][number] = 1
sdoku[x][y] = number
check(cnt+1)
row_index[x][number] = 0
col_index[y][number] = 0
square_index[square_ind][number] = 0
sdoku[x][y] = 0
row_index = [[0]*10 for _ in range(9)]
col_index = [[0]*10 for _ in range(9)]
square_index = [[0]*10 for _ in range(9)]
sdoku = []
check_list = []
for x in range(9):
input_list = list(map(int,input().split()))
for y in range(9):
if input_list[y]:
row_index[x][input_list[y]] = 1
col_index[y][input_list[y]] = 1
square_ind = x//3*3 + y//3
square_index[square_ind][input_list[y]] = 1
else:
check_list.append((x,y))
sdoku.append(input_list)
check(0)
위는 시간이 오래걸려서 개선된 버전이다. 이 방법은 col,row,square 마다 1~9까지의 list를 만들어놓고 거기서 바로 판단이 가능하게 바꿨다.
'알고리즘 > 백준' 카테고리의 다른 글
[BOJ/백준] 1197 최소 스패닝 트리 (0) | 2021.03.04 |
---|---|
[BOJ/백준] 1520 내리막길 (0) | 2021.03.04 |
[BOJ/백준] 2206 벽 부수고 이동하기 (0) | 2021.02.28 |
[BOJ/백준] 11000 강의실 배정 (0) | 2021.02.27 |
[BOJ/백준] 13911 집구하기 (0) | 2021.02.27 |