SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
문제
스도쿠는 숫자 퍼즐로,가로 9칸 세로 9칸으로 이루어져 있는 표에 1부터 9까지의 숫자를 채워 넣는 퍼즐이다.

같은 줄에 1 에서 9 까지의 숫자를 한번씩만 넣고, 3 x 3 크기의 작은 격자 또한, 1 에서 9 까지의 숫자가 겹치지 않아야 한다.

입력으로 9 X 9 크기의 스도쿠 퍼즐의 숫자들이 주어졌을 때, 위와 같이 겹치는 숫자가 없을 경우, 1을 정답으로 출력하고 그렇지 않을 경우 0 을 출력한다.
[제약 사항]
1. 퍼즐은 모두 숫자로 채워진 상태로 주어진다.
2. 입력으로 주어지는 퍼즐의 모든 숫자는 1 이상 9 이하의 정수이다.
[입력]
입력은 첫 줄에 총 테스트 케이스의 개수 T가 온다.
다음 줄부터 각 테스트 케이스가 주어진다.
테스트 케이스는 9 x 9 크기의 퍼즐의 데이터이다.
[출력]
테스트 케이스 t에 대한 결과는 “#t”을 찍고, 한 칸 띄고, 정답을 출력한다.
(t는 테스트 케이스의 번호를 의미하며 1부터 시작한다.)
문제 풀이
스도쿠는 가로, 세로, 사각형 범위 각각이 1에서부터 9까지 겹치는 숫자가 없는 퍼즐이다.
즉, 세 가지 경우를 모두 나눠 검증해야 한다.
- 가로줄 검증
- 세로줄 검증
- 3*3 사각형 검증
세 가지 검증을 모두 통과할 경우 1을 출력하고 셋 중 하나라도 통과하지 못할 경우 0을 출력하면 된다.
유효한 스도쿠 검증 방법
리스트를 이용해서 중복되는 숫자를 확인
- 검증을 위한 10 크기의 배열을 만들고, 인덱스 번호를 검증할 숫자 값으로 상정한다.
(1번째 인덱스는 숫자 1의 중복 판별, 2번째 인덱스는 숫자 2의 중복 판별...) - 가로, 세로, 사각형 각각의 경우를 함수로 나누어서 검증을 진행한다.
- 가로와 세로는 한 줄씩 탐색하면서 값이 처음 나왔을 경우 검증 배열에 방문 표시를 하고
- 이미 방문한 값일 경우, 유효하지 않은 퍼즐이므로 0을 출력하도록 한다
- 사각형 또한 3*3 크기씩 탐색하고 검증한다.
(사각형의 시작 인덱스를 다른 사각형과 구분하는 지표로 삼고, 행열을 3 길이만큼 탐색하면 된다)
작성 코드
import sys
sys.stdin = open("input.txt", "r")
def row_valid(sudoku):
for r in range(9):
visit = [False] * 10 # 1~9 숫자별 방문여부 확인. 0번째 인덱스는 버리는 값
for c in range(9):
val = sudoku[r][c]
if visit[val] == True:
return 0
else:
visit[val] = True
return 1
def col_valid(sudoku):
for c in range(9):
visit = [False] * 10 # 1~9 숫자별 방문여부 확인. 0번째 인덱스는 버리는 값
for r in range(9):
val = sudoku[r][c]
if visit[val] == True:
return 0
else:
visit[val] = True
return 1
def square_valid(sudoku):
for r_start in range(0, 9, 3):
for c_start in range(0, 9, 3):
visit = [False] * 10 # 1~9 숫자별 방문여부 확인. 0번째 인덱스는 버리는 값
for i in range(3):
for j in range(3):
val = sudoku[r_start + i][c_start + j]
if visit[val] == True:
return 0
else:
visit[val] = True
return 1
T = int(input())
for test_case in range(1, T + 1):
sudoku = [list(map(int, input().split())) for _ in range(9)] # 9*9 크기의 스도쿠
r = row_valid(sudoku)
c = col_valid(sudoku)
s = square_valid(sudoku)
if (r == 0 or c == 0 or s == 0):
ans = 0
else:
ans = 1
print(f'#{test_case} {ans}')
'Problem Solving' 카테고리의 다른 글
[백준] 11866 - 요세푸스 문제 0 in 파이썬 (0) | 2022.05.30 |
---|---|
[백준] 18258 - 큐2 in 파이썬 (0) | 2022.05.29 |
[SWEA] D3 - 13428. 숫자 조작 in 파이썬 (0) | 2022.05.24 |
[SWEA] D3 - 14178. 1차원 정원 in 파이썬 (0) | 2022.05.23 |
[SWEA] D3 - 13547. 팔씨름 in 파이썬 (0) | 2022.05.22 |