[SWEA] 1974 | 스도쿠 검증

Gaanii·2024년 11월 11일
0

Problem Solving

목록 보기
136/210
post-thumbnail

문제링크


1974 | 스도쿠 검증



풀이과정


각 위치에서 가로, 세로에 1~9 값이 중복되지 않고 있는것을 확인하고, 9개의 정사각형 가장 왼쪽 모서리에서는 정사각형에서 1~9 값이 중복되지 않고 있는것을 확인해야한다.

이중 for문으로 현재 위치에서 행, 열에 대해 값이 사용되었는지를 체크하기 위한 rows, cols를 만들자.
각 위치에 있는 숫자가 이미 사용되었다면 바로 return을 해주면 된다.
그게 아니라면 숫자가 사용되었음을 rows, cols에 표시해주자.

그리고 정사각형 부분도 체크해야하니 i % 3 == 0 and j % 3 == 0 조건을 사용해서 정사각형의 왼쪽 모서리를 찾고, for문으로 위와 같은 매커니즘으로 체크해주면 된다.

코드


T = int(input())

def check_sudoku(Mat):
    for i in range(9):
        rows, cols = [0] * 10, [0] * 10

        for j in range(9):
            # 가로 세로 체크하자
            r = Mat[i][j]
            c = Mat[j][i]

            # 숫자가 이미 사용되었다면 바로 0 리턴
            if rows[r] or cols[c]:
                return 0
            else:
                rows[r], cols[c] = 1, 1

            # 3*3 네모 부분 체크
            if i % 3 == 0 and j % 3 == 0:
                square = [0] * 10
                for x in range(i, i+3):
                    for y in range(j, j+3):
                        tmp = Mat[x][y]
                        if square[tmp]:
                            return 0
                        square[tmp] = 1

    return 1

for tc in range(1, T+1):
    puzzles = [list(map(int, input().split())) for _ in range(9)]

    result = check_sudoku(puzzles)
    print(f'#{tc} {result}')


결과


정답

0개의 댓글