Tiny Bunny
본문 바로가기
Algorithm/Python

[SWEA #1974] 스도쿠 검증

by nowag 2024. 2. 26.

문제

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

 

내가 쓴 코드

T = int(input())
for t in range(T):
    arr = [list(map(int, input().split())) for _ in range(9)]
    counts = [0] * 10
    result = 0

    # 행 검증
    cnt_r = 1
    for i in range(9):
        for j in range(9):
            counts[arr[i][j]] = 1
        for k in range(1, 10):
            if counts[k] != 1:
               cnt_r = 0
        counts = [0] * 10

    # 열 검증
    cnt_c = 1
    for i in range(9):
        for j in range(9):
            counts[arr[j][i]] = 2
        for k in range(1, 10):
            if counts[k] != 2:
                cnt_c = 0
        counts = [0] * 10

    # 3x3 검증
    cnt_t = 1
    for i in range(0, 7, 3):
        for j in range(0, 7, 3):
            for r in range(3):
                for c in range(3):
                    counts[arr[i+r][j+c]] = 3
            for k in range(1, 10):
                if counts[k] != 3:
                    cnt_t = 0
            counts = [0] * 10

    if cnt_r * cnt_c * cnt_t == 1:
        result = 1
    print(f'#{t+1} {result}')

 

출력 결과

728x90
반응형

'Algorithm > Python' 카테고리의 다른 글

[SWEA #1959] 두 개의 숫자열  (3) 2024.02.27
[BOJ #15650] N과 M(2)  (6) 2024.02.27
[SWEA #12390] 배열2 - 부분집합의 합  (0) 2024.02.25
[SWEA #12398] 스택1 - 그래프 경로  (3) 2024.02.25
[SWEA #1926] 간단한 369게임  (1) 2024.02.22