BOJ Code/Gold

[백준/BOJ] gold4 - 2239번 스도쿠 (Python)

NIMHO 2022. 7. 7. 19:41
728x90

▶2239 - 스도쿠

문제

스도쿠는 매우 간단한 숫자 퍼즐이다. 9 × 9 크기의 보드가 있을 때, 각 행과 각 열, 그리고 9개의 3 × 3 크기의 보드에 1부터 9까지의 숫자가 중복 없이 나타나도록 보드를 채우면 된다. 예를 들어 다음을 보자.

위 그림은 참 잘도 스도쿠 퍼즐을 푼 경우이다. 각 행에 1부터 9까지의 숫자가 중복 없이 나오고, 각 열에 1부터 9까지의 숫자가 중복 없이 나오고, 각 3 × 3짜리 사각형(9개이며, 위에서 색깔로 표시되었다)에 1부터 9까지의 숫자가 중복 없이 나오기 때문이다.

하다 만 스도쿠 퍼즐이 주어졌을 때, 마저 끝내는 프로그램을 작성하시오.

 

입력

9개의 줄에 9개의 숫자로 보드가 입력된다. 아직 숫자가 채워지지 않은 칸에는 0이 주어진다.

 

출력

9개의 줄에 9개의 숫자로 답을 출력한다. 답이 여러 개 있다면 그중 사전식으로 앞서는 것을 출력한다. 즉, 81자리의 수가 제일 작은 경우를 출력한다.

 

예제

 

풀이

예전에 풀었던 백준 2580 스도쿠 문제랑 똑같은 문제이다.

2022.06.05 - [BOJ Code/Gold] - [백준/BOJ] gold4 - 2580번 스도쿠 (Python)

 

[백준/BOJ] gold4 - 2580번 스도쿠 (Python)

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

dhalsdl12.tistory.com

달라진 건 처음 스도쿠 값을 받을 때 띄어쓰기 없이 그냥 받는다는 것이다.

그래서 그 부분만 바꿔서 제출하면 정답이 나온다.

import sys


def Sudoku(num):
    if num == len(blank):
        for sudo in sudoku:
            for su in sudo:
                print(su, end='')
            print()
        exit(0)

    x_blank, y_blank = blank[num]
    for i in range(1, 10):
        if check_RowColRect(x_blank, y_blank, i):
            sudoku[x_blank][y_blank] = i
            Sudoku(num + 1)
            sudoku[x_blank][y_blank] = 0


def check_RowColRect(x, y, number):
    x_rect = (x // 3) * 3
    y_rect = (y // 3) * 3
    for i in range(9):
        if number == sudoku[x][i]:
            return False
        if number == sudoku[i][y]:
            return False
        if number == sudoku[x_rect + (i // 3)][y_rect + (i % 3)]:
            return False
    return True


sudoku, blank = [], []

for i in range(9):
    sudoku.append(list(map(int, sys.stdin.readline().rstrip())))
    for j in range(9):
        if sudoku[i][j] == 0:
            blank.append((i, j))

Sudoku(0)

처음에 런타임 에러는 그냥 그대로 제출했다가 틀렸다.

시간 초과는 python3로 제출하면 그렇게 뜨는데, 지난번에도 그랬다.

왜 그런지는 몰라서 그냥 pypy3로 제출했다.

728x90