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)
달라진 건 처음 스도쿠 값을 받을 때 띄어쓰기 없이 그냥 받는다는 것이다.
그래서 그 부분만 바꿔서 제출하면 정답이 나온다.
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
'BOJ Code > Gold' 카테고리의 다른 글
[백준/BOJ] gold4 - 1987번 알파벳 (Python) (0) | 2022.07.09 |
---|---|
[백준/BOJ] gold1 - 7620번 편집 거리 (Python) / 메모리 초과 (0) | 2022.07.08 |
[백준/BOJ] gold4 - 1197번 최소 스패닝 트리 (Python) (0) | 2022.07.06 |
[백준/BOJ] gold2 - 1398번 동전 문제 (Python) (0) | 2022.07.01 |
[백준/BOJ] gold4 - 1563번 개근상 (Python) (0) | 2022.06.29 |