본문 바로가기

Algorithm/파이썬 알고리즘 문제풀이

[python/inflearn/section3] 스도쿠 검사

본 내용은 파이썬 알고리즘 문제풀이 (코딩테스트 대비) 강의를 토대로 작성하였습니다.

이미지 클릭시, 강의로 이동됩니닷 :)

# 스도쿠 검사
import sys
#sys.stdin=open("input.txt", "r")
a = [list(map(int, input().split())) for _ in range(9)]
chk_num = [0]*9
def check(a):
    # 각 행과 열을 비교
    for i in range(9):
        ch1 = ch2 = 0
        for j in range(9):
            #행 a[i][j] , 열 a[j][i]
            ch1 +=a[i][j]
            ch2 +=a[j][i]
        if ch1 != 45 or ch2 != 45:
            return False

    # 3*3 박스 비교
    for i in range(3):
        for j in range(3):
            ch3 = 0
            for k in range(3):
                for s in range(3):
                    ch3 += a[i*3+k][j*3+s]
            if ch3 != 45:
                return False
    return True

if check(a):
    print("YES")
else:
    print("NO")

열심히 머리 굴리면서 풀었는데 땡이다.
fail 케이스를 찾아보니 아래와 같다.
2+4+9+3+4+7+2+6+8
=> 얘도 합이 45..
숫자도 중복이고 빠진값도 있는데 절묘하게도 합이 45다.
구글링을 해보니 위와 같은 케이스때문에
대부분 1~9 까지의 합으로 판별을 하지않는다.

# 스도쿠 검사
import sys
#sys.stdin=open("input.txt", "r")
a = [list(map(int, input().split())) for _ in range(9)]

def check(a):
    # 각 행과 열을 비교
    for i in range(9):
        ch1 = ch2 = [0]*10
        for j in range(9):
            #행 a[i][j] , 열 a[j][i]7
            ch1[a[i][j]] = 1
            ch2[a[j][i]] = 1
        if sum(ch1) != 9 or sum(ch2) != 9:
            return False

    # 3*3 박스 비교
    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

if check(a):
    print("YES")
else:
    print("NO")

강사님의 코드로 이해하였다.
1~9 까지의 합 대신 숫자가 나오면 1로 변경 후 비교 처리 하는 코드.
이외에 set 을 이용해 처리하는 방법도 있음