[SWEA] 1974_스도쿠 검증

김태민·2021년 9월 1일
2

알고리즘

목록 보기
11/77

Mingssssss

1. 문제

스도쿠는 숫자퍼즐로, 가로 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부터 시작한다.)

2. 코드

import sys
sys.stdin = open('input.txt')

def serch():
    num_list = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    for i in range(9):  # 가로 탐색
        exam_list = []  # 리스트 초기화
        for j in range(9):
            exam_list.append(arr[i][j])  # 각각의 값 추가
        if num_list == sorted(exam_list):
            continue
        else:
            return 0

    for r in range(9):  # 세로 탐색
        exam_list = []
        for c in range(9):
            exam_list.append(arr[c][r])
        if num_list == sorted(exam_list):
            continue
        else:
            return 0

    for i in range(0, 9, 3):  # 격자 탐색
        for j in range(0, 9, 3):
            exam_list = []
            for k in range(3):
                for t in range(3):
                    if exam_list:
                        if arr[i + k][j + t] in exam_list:
                            return 0
                    exam_list.append(arr[i + k][j + t])
    return 1

T = int(input())
for tc in range(T):
    arr = [list(map(int, input().split())) for _ in range(9)]
    print('#{} {}'.format(tc+1, serch()))

3. 리뷰

가로와 세로 탐색은 쉬웠지만, 격자 탐색이 어려웠다.
range 범위를 잘 생각해서 짜고, arr의 인덱스를 3x3씩 9개를 탐색하도록
짜면 어렵지 않게 풀 수 있었던 것 같다.

profile
어제보다 성장하는 개발자

0개의 댓글