알고리즘/SWEA

[Python] SWEA D2 1974번 - 스도쿠 검증

번잔중 2022. 8. 21. 19:21
 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

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

    # 행
    for i in range(9):
        num = []
        for j in range(9):
            if num:
                if sudoku[i][j] in num:
                    chk = 0
                    break
            num.append(sudoku[i][j])

    # 열
    for i in range(9):
        num = []
        for j in range(9):
            if num:
                if sudoku[j][i] in num:
                    chk = 0
                    break
            num.append(sudoku[j][i])

    # 3 x 3
    for i in range(0, 9, 3):
        for j in range(0, 9, 3):
            num = [] # 아래의 중첩 for문에서 검사하기 때문에 이 위치에서 초기화
            for k in range(3):
                for r in range(3):
                    if num:
                        if sudoku[i + k][j + r] in num:
                            chk = 0
                            break
                    num.append(sudoku[i + k][j + r])

    print('#%d %d' % (t, chk))

- 행, 열, 3x3 구간 전체를 검사해주어야 합니다.

- 각 범위 내에서 1~9까지의 수가 중복된다면 0이 출력될 수 있도록 chk를 0으로 설정한 후 break를 통해 빠져나옵니다.

- 아닌 경우는 chk가 1인 상태로 출력됩니다.

- 이 중에서 3 x 3을 검사하는 경우는 0,0 ~ 2,2를 거쳐 0,3 ~ 2,5 → 0,6 ~ 2,8 순으로 가로방향 탐색을 실시합니다. 그래서 바깥쪽 2개의 for문은 0부터 9까지 3개씩 증가하도록 만들었습니다. 

 

피드백은 언제나 환영합니다.