본문 바로가기

알고리즘/백준

[백준] 2580번 : 스도쿠

728x90

https://www.acmicpc.net/problem/2580

 

2580번: 스도쿠

스도쿠는 18세기 스위스 수학자가 만든 '라틴 사각형'이랑 퍼즐에서 유래한 것으로 현재 많은 인기를 누리고 있다. 이 게임은 아래 그림과 같이 가로, 세로 각각 9개씩 총 81개의 작은 칸으로 이루

www.acmicpc.net

해당 문제는 완전탐색 문제로 비어있는 테이블을 확인하고 비어있는 테이블에서 넣을 수 있는 수를 구한뒤 넣어본다. 그리고 넣은 곳을 반드시 초기화 해 주어야 다른 깊이우선 탐색에서 다시 넣어 볼 수 있다.

table = []

for i in range(9):
    new = list(map(int, input().split()))
    table.append(new)
    
def get_vailed(table):
    for row in range(9):
        for col in range(9):
            if table[row][col] == 0:
                return row, col
    
    return None
    
def is_vailed(col, row , num):
    
    for k in range(9):
        if table[col][k] == num:
            return False
    
    for k in range(9):
        if table[k][row] == num:
            return False
        
    newcol = (col//3) * 3
    newrow = (row//3) * 3
    
    for k in range(3):
        for n in range(3):
            if table[k+newcol][n+newrow] == num:
                return False
            
    return True

def sudoku(table):
    if not get_vailed(table): # 모든 스도쿠가 꽉 차면
        return True
    
    col, row = get_vailed(table)
    
    for num in range(1,10):
        if is_vailed(col,row, num):
            table[col][row] = num # 숫자를 넣어본다.
            
            if sudoku(table):
                return True

            table[col][row] = 0 # 넣은 숫자를 뺀다.


                
sudoku(table)

for i in range(len(table)):
    print(*table[i])
728x90

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 2294번 : 동전 2  (0) 2023.07.24
[백준] 1987번 :알파벳  (0) 2023.07.23
[백준] 2585번 : 경비행기  (0) 2023.07.23
[백준] 23083번 : 꿀벌 승연이  (0) 2023.07.23
[백준] 19942번 : 다이어트  (0) 2023.07.23