알고리즘/백준

2580번: 스도쿠

happenundo 2023. 3. 10. 13:33
728x90
 

2580번: 스도쿠

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

www.acmicpc.net

백트래킹을 사용해서 스도쿠를 채우면 되는 문제다.

 

스도쿠 판에 0이 들어 있는 칸들을 저장하는 리스트 zeros를 만들어준다.

zeros리스트에서 칸들을 하나씩 확인하면서, 숫자를 넣을 수 있는지 없는지 검증한다.

1부터 10까지 for문을 돌면서 i를 통해 해당 칸의 가로, 세로, 그리고 해당 칸이 포함된 3X3 사각형을 모두 확인해서 숫자를 넣을 수 있는 경우,  스도쿠 판의 숫자를 해당 i로 바꿔준다.

 

board = [list(map(int, input().split())) for _ in range(9)]

zeros = [] # 0인 칸들을 저장하는 리스트
for i in range(9):
    for j in range(9):
        if board[i][j] == 0:
            zeros.append((i, j))


# 보드의 (i,j)칸에 숫자 n이 들어가도 되는지 확인하는 함수
def check_sudoku(i, j, n):
    
    # 대각선 확인을 위한 계산
    tx = j // 3 * 3
    ty = i // 3 * 3
    
    for x in range(9):
        # 가로 확인
        if board[i][x] == n:
            return False
        # 세로 확인
        if board[x][j] == n:
            return False
        # 3*3 사각형 확인
        if board[ty + x // 3][tx + x % 3] == n:
            return False
        
    return True





def back_tracking(num):
    if num == len(zeros):
        for line in board:
            print(*line)
        exit(0)
    
    else:
        y, x = zeros[num]
        for i in range(1, 10):
            if check_sudoku(y, x, i):
                board[y][x] = i
                back_tracking(num+1)
                board[y][x] = 0


back_tracking(0)

참고

 

(파이썬) 백준 2580번 "스도쿠"

# 답 import sys board = [list(map(int, sys.stdin.readline().split())) for _ in range(9)] zero = [] for y in range(9): for x in range(9): if not board[y][x]: zero.append((y, x)) def is_sudoku(ty, tx, n): y = (ty // 3) * 3 x = (tx // 3) * 3 for i in range(9

beluga9.tistory.com

 

[Python] 백트래킹 (+ DFS와 차이)

백트래킹이란? 백트래킹이란 현재 상태에서 가능한 모든 경로를 따라 들어가 탐색하다, 원하는 값과 불일치하는 부분이 발생하면 더 이상 탐색을 진행하지 않고 전 단계로 돌아가는, 즉 이름 그

veggie-garden.tistory.com

 

[실전 알고리즘] 0x0C강 - 백트래킹

이번에는 백트래킹을 배워보도록 하겠습니다. 백트래킹도 재귀와 더불어 많은 사람들이 고통을 호소하는 알고리즘 중 하나이지만 의외로 그 재귀적인 구조에 매료되어서 참재미를 알아버리는

blog.encrypted.gg

 

728x90