# 스도쿠
import sys
input = sys.stdin.readline
N = 9
arr = []
empty = []
for i in range(N):
arr.append(list(input().strip()))
for j in range(N):
if arr[i][j] == '0':
empty.append((i, j))
def add_num(k):
global isDone
if k == len(empty):
isDone = True
return
temp = check_available_num(empty[k][0], empty[k][1])
for x in temp:
arr[empty[k][0]][empty[k][1]] = x
add_num(k+1)
if isDone:
return
arr[empty[k][0]][empty[k][1]] = '0'
def check_available_num(x, y):
temp = []
for target in range(1, N+1):
target = str(target)
if check_rcs(x, y, target):
temp.append(target)
return temp
def check_rcs(x, y, target):
for j in range(N):
if arr[x][j] == target:
return False
for i in range(N):
if arr[i][y] == target:
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] == target:
return False
return True
isDone = False
add_num(0)
for i in range(N):
print(''.join(arr[i]))
백트랙킹
1. 입력 받을 때 '0'인 좌표를 empty리스트에 따로 append한다.
2. check_available_num : 1~9까지의 수 중에서 check_rcs를 통과한 숫자들의 리스트를 반환
- 1부터 숫자를 append해야 문제의 조건인 '답이 여러 개 있다면 그 중 사전식으로 앞서는 것을 출력'을 만족
3. check_rcs : row, column, square를 확인해서 해당 숫자가 스도쿠의 조건에 맞는지 확인
4. 백트랙킹을 이용해서 empty를 하나씩 채워나간다.
5. 결과값을 join을 이용해서 출력
예전에 풀었던 2252번 스도쿠문제와 똑같은 원리의 문제라서 쉽게 풀었다.
[백준] 2252번 - 스도쿠
[백준] 2252번 - 스도쿠 (파이썬)
# 스도쿠 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..
2hs-rti.tistory.com
'Algorithm > BOJ' 카테고리의 다른 글
[백준] 2812번 - 크게 만들기 (파이썬) (0) | 2022.03.09 |
---|---|
[백준] 17822번 - 원판 돌리기 (파이썬) (0) | 2022.03.08 |
[백준] 2665번 - 미로만들기 (파이썬) (0) | 2022.03.04 |
[백준] 4179번 - 불! (파이썬) (0) | 2022.03.03 |
[백준] 2075번 - N번째 큰 수 ( 파이썬) (0) | 2022.03.02 |