Koala - 17기/코딩테스트 심화 스터디

[백준/Python] #9291 스도쿠 채점

영찬_ 2025. 1. 12. 17:28

https://www.acmicpc.net/problem/9291

알고리즘

스도쿠를 풀때처럼 단순하게

  • 한 열에 대해서 1~9 확인
  • 한 행에 대해서 1~9 확인
  • 3*3 정사각형에 대해서 1~9 확인

일련의 3가지 과정을 거친후 모든조건에 맞다면 스도쿠의 올바른 답인것을 확인 할 수 있다.

코드

import sys
input = sys.stdin.readline

t = int(input())
for case in range(1,t+1):
    arr = []
    for _ in range(9):
        arr.append(list(map(int,input().split())))

    flag = True

    #check row
    for i in range(9):
        checked = [False]*9
        for j in range(9):
            checked[arr[i][j]-1] = True
        if False in checked:
            flag = False
            break

    #check col
    if flag:
        for i in range(9):
            checked = [False] * 9
            for j in range(9):
                checked[arr[j][i] - 1] = True
            if False in checked:
                flag = False
                break

    #check 3*3
    if flag:
        for i in range(3):
            for j in range(3):
                checked = [False] * 9
                for k in range(3):
                    for l in range(3):
                        checked[arr[i*3+k][j*3+l]-1] = True
                if False in checked:
                    flag = False

    if flag:
        print(f"Case {case}: CORRECT")
    else:
        print(f"Case {case}: INCORRECT")

    #get empty
    if case < t:
        input()

각각의 경우에 대해 checked 배열을 이용하여 1~9를 카운팅해주고 해당 배열에 False가 존재한다면 1~9가 각각 1개씩 존재하지 않게 되므로 False처리를 해주면 된다.

최대한 시간을 줄이기 위해 col, 3*3 확인과정에서 flag가 False라면 이미 올바르지 않은 스도쿠이므로 건너뛰도록 한다.