본문 바로가기
TIL - 프로그래밍/Python 알고리즘

[SWEA] 1974. 스도쿠 검증 - Python

by chaemj97 2022. 2. 20.
728x90

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5Psz16AYEDFAUq 

 

SW Expert Academy

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

swexpertacademy.com

 

< 📝 문제 >

스도쿠는 숫자퍼즐로, 가로 9칸 세로 9칸으로 이루어져 있는 표에 1 부터 9 까지의 숫자를 채워넣는 퍼즐이다.

같은 줄에 1 에서 9 까지의 숫자를 한번씩만 넣고, 3 x 3 크기의 작은 격자 또한, 1 에서 9 까지의 숫자가 겹치지 않아야

 

한다

입력으로 9 X 9 크기의 스도쿠 퍼즐의 숫자들이 주어졌을 때, 위와 같이 겹치는 숫자가 없을 경우, 1을 정답으로 출력하

 

고 그렇지 않을 경우 0 을 출력한다.


< ❓ 생각 >


< 💻 코드 >

def sudoku(arr):
    for i in range(9):

        # 숫자에 해당하는 idx에 1 추가
        # 요소에 숫자가 2이상인 것이 있으면 스도쿠 X

        # 가로 검사
        lst_h = [0] * 10
        # 세로 검사
        lst_v = [0]*10
        for j in range(9):
            # 가로검사
            lst_h[arr[i][j]] += 1
            if lst_h[arr[i][j]] == 2:
                return 0
            # 세로 검사
            lst_v[arr[j][i]] += 1
            if lst_v[arr[j][i]] == 2:
                return 0

    # 3*3 검사
    # x,y 3*3스도쿠 검사의 시작점
    for x in range(0,9,3):
        for y in range(0,9,3):
            # 3*3 검사
            lst_3 = [0] * 10
            for i in range(3):
                for j in range(3):
                    lst_3[arr[x+i][y+j]] += 1
                    if lst_3[arr[x+i][y+j]] == 2:
                        return 0
    return 1

# 테스트 케이스 개수
T = int(input())
for tc in range(1,T+1):
    arr = [list(map(int,input().split())) for _ in range(9)]

    result = sudoku(arr)
    print(f'#{tc} {result}')
728x90
반응형

댓글