스도쿠 검사

개발새발개발러·2022년 5월 10일
0

알고리즘

목록 보기
11/11
post-thumbnail

문제

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

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

입력설명

첫 번째 줄에 완성된 9×9 스도쿠가 주어집니다.

출력설명

첫째 줄에 “YES" 또는 ”NO"를 출력하세요.

입력예제 1

1 4 3 6 2 8 5 7 9
5 7 2 1 3 9 4 6 8
9 8 6 7 5 4 2 3 1
3 9 1 5 4 2 7 8 6
4 6 8 9 1 7 3 5 2
7 2 5 8 6 3 9 1 4
2 3 7 4 8 1 6 9 5
6 1 9 2 7 5 8 4 3
8 5 4 3 9 6 1 2 7

출력예제 1

YES

풀이

from re import S
import sys
# sys.stdin = open("input.txt","rt")

# 배열 중복 체크 함수
def check(a):
    for i in range(len(a)):
        # ch1=> 행 중복체크 배열
        # ch2=> 열 중복체크 배열
        ch1=[0]*10
        ch2=[0]*10
        for j in range(len(a)):
            # 1~9까지의 수가 중복이 없어야 하므로 1~9까지의 인덱스가 있는
            # ch(check)배열을 생성 후 각 요소의 값을 인덱스로하여 1로 초기화 후 
            # 1~9까지의 값이 모두 있을 경우 ch배열의 총합이 9
            ch1[a[i][j]]=1
            ch2[a[j][i]]=1
        #총합이 9가 아닐 경우 중복된 값이 있으므로 "no" 출력 후 break 
        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

a = [list(map(int, input().split())) for _ in range(9)]
if check(a):
    print("YES")
else:
    print("NO")

해설

중복요소 체크 로직 설명

=> 우선 길이 9의 배열을 0으로 초기화 후 체크하고자 하는 배열의 각각의 값을 ch배열 index에 1로 초기화 한다면 1~9까지의 수가 모두 있다면 해당 ch배열의 총합은 9가 되고 만약 중복된 값이
존재할 경우 ch배열에서 1로 초기화된 곳에 다시 1로 초기화 되면서 9보다 작은 수가 됨 따라서
ch총합으로 중복체크 가능

0개의 댓글