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 |