❗[알고리즘]스도쿠 검사

김도연·2024년 1월 10일

알고리즘

목록 보기
21/56

문제

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

위 그림은 스도쿠를 정확하게 푼 경우이다. 각 행에 1부터 9까지의 숫자가 중복 없이 나오 고, 각 열에 1부터 9까지의 숫자가 중복 없이 나오고, 각 3×3짜리 사각형(9개이며, 위에서 색 깔로 표시되었다)에 1부터 9까지의 숫자가 중복 없이 나오기 때문이다.
완성된 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

[해설코드]

def check(a):
#ch1,ch2배열을 생성하여 다 0값으로 초기화
	for i in range(9):
    #ch1은 행을 체크, ch2는 열을 체크
    	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개의 3X3 정사각형을 찾는 코드
    for i in range(3):
    	for j in range(3):
        	ch3=[0]*10
            #찾은 3X3정사각형을 ch3에 넣어주고 해당번호의 인덱스에 1을 삽입
            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")
            
            
  1. ch라는 새로운 리스트를 생성해서 해당번호가 존재하면 해당번호를 인덱스로 하여 1를 삽입
  2. 행과 열을 검사할 때 ch1,ch2배열을 사용
  3. 하나의 정사각형 3x3 을 검사할 때 ch3배열을 이용

0개의 댓글