-
1. 코드123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051sudoku = [list(map(int,input().split())) for _ in range(9)]def findBlank():for i in range(9):for j in range(9):if sudoku[i][j] == 0:return i,jreturn -1, -1def checkrow(r,n):for i in range(9):if sudoku[r][i] == n:return Falsereturn Truedef checkcol(c,n):for i in range(9):if sudoku[i][c] == n:return Falsereturn Truedef checkbox(r,c,n):row = (r//3)*3col = (c//3)*3for i in range(3):for j in range(3):if sudoku[row+i][col+j] == n:return Falsereturn Truedef Isok(r,c,n):if checkrow(r,n) and checkcol(c,n) and checkbox(r,c,n):return Truereturn Falsedef fill():r, c = findBlank()if r == -1:return Truefor n in range(1,10):if Isok(r,c,n):sudoku[r][c] = nif fill():return Truesudoku[r][c] = 0return Falsefill()for i in range(9):print(*sudoku[i])
cs 2. 후기
알고리즘 분류 - 백트래킹
파이썬으로 푸니깐 시간초과가 나온다. 마지막은 배열을 간단히 출력할 때 유용하다.
이 코드는 fill에서 재귀를 돌면서 스도쿠에서 가장처음으로 비어있는 칸을 찾은 후 모든 조건(가로,세로,네모)를 만족하는 1~9중 수를 찾아 입력한다.
만약 다음 빈칸에서 모든 수를 넣어도 만족하지 않으면 그 전으로 돌아와 다른 수를 넣고 다시 시도한다.
'알고리즘 > 백준' 카테고리의 다른 글
2003 수들의 합 2 - 투포인터 (0) 2019.03.08 12100번 2048(easy) - DFS (0) 2019.03.08 13460 구슬 탈출 2 -BFS (0) 2019.03.07 1062 가르침 (1) 2019.03.06 14391 종이조각 (0) 2019.03.06