728x90
 

9291번: 스도쿠 채점

각 테스트 케이스에 걸쳐 "Case x:"를 출력한 후, 공백 한 칸 뒤에 풀이가 올바르면 "CORRECT"를, 아니면 "INCORRECT"를 출력한다. x는 테스트 케이스 번호이며, 1부터 시작한다.

www.acmicpc.net

문제)

 스도쿠는 일본어로 "수독(數獨)"을 읽은 것이다. 이는 미국에서 유명한 일본의 한 퍼즐 이름이기도 하다. 스도쿠는 9x9 격자판에 다음 조건을 만족하여 수를 채워 넣는 게임이다.

  • 각 정수 1-9는 각 행에 정확히 한 번씩 등장해야 한다.
  • 각 정수 1-9는 각 열에 정확히 한 번씩 등장해야 한다.
  • 각 정수 1-9는 각 작은 3x3 정사각형에 정확히 한 번씩 등장해야 한다.

 남규는 스도쿠에 푹 빠져서 하루종일 스도쿠 문제를 풀던 와중, 스도쿠를 풀었지만 그것이 정답인지를 쉽게 확인할 수 없어 고민에 빠졌다. 불쌍한 남규를 위해 다 채워진 스도쿠 판이 올바른 답인지 판별하는 프로그램을 작성해 주자.

 

입력)

 입력의 첫 줄에는 테스트 케이스의 개수가 주어진다.

 각 테스트 케이스는 9개의 줄로 이루어져 있으며, 각 줄에는 9개의 정수가 공백으로 구분되어 있다. 각 정수는 1 이상 9 이하이다. 테스트 케이스의 사이에는 빈 줄이 하나 있다.

 테스트 케이스의 개수는 100개를 넘지 않는다.

 

 

출력)

 각 테스트 케이스에 걸쳐 "Case x:"를 출력한 후, 공백 한 칸 뒤에 풀이가 올바르면 "CORRECT"를, 아니면 "INCORRECT"를 출력한다. x는 테스트 케이스 번호이며, 1부터 시작한다.


from sys import stdin

rd = stdin.readline

def check_line(line):
    return len(set(line)) == 9

def check_square(board, r, c):
    square = [board[r+i][c+j] for i in [0, 1, 2] for j in [0, 1, 2]]
    return len(set(square)) == 9

T = int(rd())
for t in range(1, T+1):
    sudoku = [rd().split() for _ in range(9)]

    correct = True

    for row in sudoku:
        if not check_line(row):
            correct = False
            break

    if correct:
        for col in zip(*sudoku):
            if not check_line(col):
                correct = False
                break

    if correct:
        for n in range(0, 7, 3):
            for m in range(0, 7, 3):
                if not check_square(sudoku, n, m):
                    correct = False
                    break

            if not correct:
                break

    answer = "CORRECT" if correct else "INCORRECT"
    print(f"Case {t}: {answer}")

    if t < T:
        rd()

풀이 :

 모든 행과 열, 3x3 사각형에 중복되는 숫자가 있으면 안된다는 것을 이용하기 위해 중복을 제거해주는 set함수를 사용하였다. 행과 열에 대한 정보를 set함수에 넣은뒤 그 결과값의 길이가 9보다 작다면 중복되는 숫자가 존재하는 것으로 스도쿠는 정답이 아니게 된다. 그 후에 각 사각형에 대한 정보를 set함수에 넣어서 길이를 확인한 뒤 최종 결과를 출력해준다.

+ Recent posts