본문 바로가기
알고리즘?/기본3 탐색&시뮬레이션(string, 1차원 2차원 리스트 탐색)

10. 스도쿠

by 몰라닉네임 2023. 5. 12.

[문제설명]

idea, 구현력.

 

[문제 스도쿠]

스도쿠는 매우 간단한 숫자 퍼즐이다. 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

 

 

[풀이]

#i 가 돌때마다 리스트 초기화하면서

a[0]                a[1]              a[2]                    a[3]              a[4]                  a[5]              a[6]              a[7]                  a[8]

                 

1.행 탐색

ch1[a[i][j]]=1  : 각 인덱스에 1을 더하는게 아니라 1을 대입한다. 그래서 중복되는게 있으면 그 인덱스는 2가 되는 게 아니라 1이 된다. 그래서 나머지 한 인덱스가 0으로 비어있게 된다. 

sum(ch1)!=0 return False

 

2. 열탐색 

ch2[a[j][h]]  i,j 만 바꿔주면 된다. 

 

3. 9개씩 그룹으로 탐색

ch3=a[i*3+k][j*3+k]

 

[소스코드]

import sys
sys.stdin=open("input.txt", "rt")

def check(a):
    for i in range(9):
        #i 가 돌때마다 리스트 초기화
        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
    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")