ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • section3.10 스토쿠 검사
    알고리즘 2022. 10. 31. 16:48

    스도쿠는 매우 간단한 숫자 퍼즐이다. 9×9 크기의 보드가 있을 때, 각 행과 각 열, 그리고 9 개의 3×3 크기의 보드에 1부터 9까지의 숫자가 중복 없이 나타나도록 보드를 채우면 된다. 예를 들어 다음을 보자.

    위 그림은 스도쿠를 정확하게 푼 경우이다. 각 행에 1부터 9까지의 숫자가 중복 없이 나오 고, 각 열에 1부터 9까지의 숫자가 중복 없이 나오고, 각 3×3짜리 사각형(9개이며, 위에서 색 깔로 표시되었다)에 1부터 9까지의 숫자가 중복 없이 나오기 때문이다. 완성된 9×9 크기의 수도쿠가 주어지면 정확하게 풀었으면 “YES", 잘 못 풀었으면 ”NO"를 출력하는 프로그램을 작성하세요.

     

     

    import sys
    sys.stdin = open("input.txt", "rt")
    chlist = [list(map(int, input().split())) for _ in range(9)]
    
    def check(chlist):
        for x in range(9):
            olist = list(range(1, 10))
            rowlist = []
            collist = []
            
            for y in range(9):
                rowlist.append(chlist[x][y])
                collist.append(chlist[y][x])
             
            if sorted(rowlist) != olist or sorted(collist) != olist:
                print("NO")
                break
        else:
            for x in range(0, 9, 3):
                for y in range(0, 9, 3): 
                    emlist = []
                    
                    for z in range(3): 
                        for k in range(3):
                            emlist.append(chlist[x+z][y+k])
                    
                    if sorted(emlist) != olist:
                        print("NO")
                        break
    
            print("YES")
    
    check(chlist)

     

     

    어디서 틀린지 모르겠다

    5개 테스트 중 1개가 wrong 으로 나오는데

    아무리 봐도 틀린 지점이 없는데...

     

     

    import sys
    sys.stdin = open("input.txt", "rt")
    
    def check(a):
    
        for i in range(9):
            ch1 = [0]*10
            ch2 = [0]*10
            for j in range(9):
                ch[a[i][j]] = 1
                ch[a[j][i]] = 1
            if sum(ch1) != 9 or sum(ch2) != 9:
                return False
        
        for i in range(3):
            for j in range(3):
                ch3 = [o]*10
                for k in range(3):
                    for s in range(3):
                        ch3[a[i*3+k][j*3+s]] = 1
                    if sum(ch3) != 9:
                        return False
                        
        return Ture
    
    a = [list(map(int, input().split())) for _ in range(9)]
    
    if check(a):
        print("YES")
    else:
        print("NO")

     

     

    처음에 코드를 작성하면서 확인하는 함수를 만들고 그것의 return으로 true / false 값을 받고 싶었다

    return 하면 함수가 끝난다는 걸 까먹고 break로 어떻게 해보려다가 실패하고 for else문을 사용했다

    조금 아쉽다

     

    나는 1~9까지 있는 리스트와 직접 비교를 통해 검사를 진행했는데

    정답 코드는 ch라는 빈 리스트를 만들고 1을 체크해 합을 비교하는 방식이었다

    아직 시간/공간 복잡도에 대해 잘 몰라서 확신을 못하지만

    저번 문제에서도 그렇고 빈 리스트를 만들어 체크하는 경우가 자주 있었다

    나중에 복잡도를 고려하게 된다면 두 가지를 비교해 봐야겠다

    728x90
Designed by Tistory.