728x90
다른 코드 참조: O, 푼 횟수: 7
풀이과정
빈칸을 돌며 빈칸에 1~9중 가능한 숫자들을 하나씩 대입해 보며 빈칸을 채우는 식으로 진행하면 된다.
1. 빈칸을 계속 돌며 가능한 숫자를 대입해 봐야 하므로 빈칸 위치를 저장해야 한다.
따라서, 빈칸의 위치를 저장하는 리스트 blank를 만들고 그 리스트를 돌아보게 하면 된다.
2. 가능한 수들은
(1). 해당 행에서 1~9 숫자 중 존재하지 않는 수
(2). 해당 열에서 1~9 숫자 중 존재하지 않는 수
(3). 해당 3*3칸에서 1~9 숫자 중 존재하지 않는 수
를 기준으로 판별하면 된다.
3. 다음칸도 마찬가지로 blank의 끝에 도달할때까지 계속한다.
4. blank의 끝에 도달했다면 출력한다.
코드
import sys
table = [[] for i in range(9)]
for i in range(9):
table[i] = list(map(int, sys.stdin.readline().split()))
blank = []
for i in range(9):
for ii in range(9):
if table[i][ii] == 0:
blank.append([i, ii])
def isAble(row, col, n): #n이 가능한 수인지 판별
for i in range(0, 9):
if table[row][i] == n:
return False
if table[i][col] == n:
return False
if table[(row//3)*3+i//3][(col//3)*3+i%3] == n:
return False
return True
def sudoku(x):
if x == len(blank):
for i in range(9):
print(*table[i])
exit(0)
else:
i = blank[x][0]
ii = blank[x][1]
for iii in range(1, 10): #1~9
if isAble(i, ii, iii): #해당 수가 가능한 수인지 판별
table[i][ii] = iii #대입
sudoku(x+1) #다음 빈칸
table[i][ii] = 0 #만약 모든 빈칸을 채울 수 없다면 0으로 초기화
sudoku(0)
반응형
'알고리즘 > BAEKJOON' 카테고리의 다른 글
[백준] 1918: 후위 표기식 (0) | 2024.01.30 |
---|---|
[백준] 2206: 벽 부수고 이동하기 (1) | 2024.01.26 |
[백준] 1932: 정수 삼각형 - 동적계획법 (0) | 2023.10.16 |
[백준] 11401: 이항 계수 3 - 분할 정복, 페르마의 소정리 (1) | 2023.10.14 |
[백준] 1912: 연속합 - 동적 계획법 (0) | 2023.10.10 |