본문 바로가기
알고리즘

[SWEA D2/파이썬(Python)] 스도쿠 검증

by Rudy 2023. 2. 4.

문제

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

 

SW Expert Academy

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

swexpertacademy.com


 

코드

def checkNumber(array):
    set1, set2, set3, set4 = set(), set(), set(), set()
    col=[set() for _ in range(9)]
    cnt=0
    for i in range(9):
        cnt+=1
        set4 = set()
        for j in range(9):
            col[j].add(array[i][j])
            if array[i][j] in set4:
                return 0
            else:
                set4.add(array[i][j])
            if 0<=j<=2:
                if array[i][j] in set1:
                    return 0
                else:
                    set1.add(array[i][j])
            elif 3<=j<=5:
                if array[i][j] in set2:
                    return 0
                else:
                    set2.add(array[i][j])
            elif 6<=j<=8:
                if array[i][j] in set3:
                    return 0
                else:
                    set3.add(array[i][j])
        #print(set1,set2,set3,set4)
        if cnt==3:
            set1,set2,set3=set(),set(),set()
            cnt=0
    for i in range(9):
        if len(col[i])!=9:
            return 0

    return 1

t=int(input())
for i in range(t):
    array=[]
    for _ in range(9):
        inputNumberList=list(map(int,input().split()))
        array.append(inputNumberList)

    result=checkNumber(array)
    print("#%d" % (i+1),result)

풀이


이 문제 푸는데 테케가 자꾸 틀려서 왜지하고 계속 생각했는데 알고보니 행, 열, 3*3 전부 고려해야했던 문제였다. 문제를 제대로 잘 읽고 풀자…

  1. 행별로 루프 돌면서 숫자가 하나씩만 있는지 set 자료형을 이용해서 확인한다. 이는 2중 루프 중 내부 루프에서 확인한다. 내부루프가 끝나면 항상 set4를 초기화시켜준다.→set4
  2. set 자료형을 3개 만들어서 바깥 루프를 돌 때마다 cnt를 1씩 증가시키고, 내부루프를 돈 다음 cnt가 3이면 0으로 다시 초기화한다. 3*3 격자를 확인해야 하기 때문이다. 그리고 set1~3도 초기화시켜준다.

       →set에 숫자를 넣기 전에 현재 숫자가 있는지 없는지 확인한다. 만약 있으면 바로 0을 리턴한다.

   3. 열은 col이라는 리스트에 set자료형을 9만큼 만들어 준다음, 내부 루프 돌 때마다 현재 돌고 있는 원소를 열 별로 넣어준다. 그리고 마지막에 루프돌면서 길이가 9가 아닌 것이 발견되면 0을 리턴한다.

댓글