[SW Academy] 1974. 스도쿠 검증

DreamJJW·2023년 6월 2일
0

SW Academy

목록 보기
17/26

📖 문제

※ SW Expert 아카데미의 문제를 무단 복제하는 것을 금지합니다.

스도쿠는 숫자퍼즐로, 가로 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까지의 숫자 중 겹치는 숫자가 있는지 판별하는 문제이다.
중복 판별에는 각 row와 col의 합을 구하는법을 떠올릴 수 있지만, 반례가 있다.
그래서 나는 set()으로 중복을 제거하는 방법을 떠올렸다. (set()과 dict()은 중복 허락 X)

각 row와 col, 그리고 3x3영역의 리스트를 만든 후, set()으로 중복제거 후, 만약 set()의 길이가 9가 아니라면, 중복이 있는 것이므로 판별이 가능하다.


T = int(input())
# 여러개의 테스트 케이스가 주어지므로, 각각을 처리합니다.
for test_case in range(1, T + 1):
    sudoku = []
    answer = 1
    for i in range(9):
        sudoku.append(list(map(int, input().split())))

    # 가로 판별
    for row in sudoku:
        if len(set(row)) != 9:
            answer = 0

    # 세로 판별
    for col in range(9):
        temp = []
        for j in range(9):
            temp.append(sudoku[j][col])
        if len(set(temp)) != 9:
            answer = 0

    # 3x3 영역 판별
    for i in range(0, 9, 3):
        for j in range(0, 9, 3):
            temp = []
            for x in range(3):
                for y in range(3):
                    temp.append(sudoku[x+i][y+j])
            if len(set(temp)) != 9:
                answer = 0

    print("#{0} {1}".format(test_case, answer))


profile
간절한 사람

0개의 댓글