본문 바로가기
자료구조&알고리즘

[파이썬 알고리즘 문제풀이 입문] 4-10. 스토쿠 검사

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

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

내 풀이 - 시간 내로 풀지 못함

sd = [list(map(int, input().split()) for _ in range(9))]

# 네모 모양 확인
xy = [0, 1, 2]
sum = 0
for i in [0, 3, 6]:
    for j in [0, 3, 6]:
        if sum(sd[i+k][j+k]) == 55 for k in xy:
sum = 0
for i in range(10):
    sd[i][0]

쌤 풀이

def check(a):
    # 행과 열 체크
    for i in range(9):
        ch1 = [0]*10
        ch2 = [0]*10
        for j in range(9):
            ch1[a[i][j]] = 1
            ch2[a[j][i]] = 1
        if sum(ch1) != 9 or sum(ch2) != 9:
            return False
    # 네모박스 체크 - 9개의 그룹
    for i in range(3):
        for j in range(3):
            ch3 = [0] * 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 True

a = [list(map(int, input().split())) for _ in range(9)]
if check(a):
    print("YES")
else:
    print("NO")
  • 4중 for문을 시간복잡도 때문에 무서워한다…….
  • 방법은 생각해냈는데 시간이 오래걸릴까봐 시도하지 못함