[알고리즘] 스토쿠 검사

(문제) 스토쿠 검사


스도쿠는 매우 간단한 숫자 퍼즐이다.

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 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
YES
1 2 3 4 5 6 7 8 9
2 1 4 3 6 5 8 9 7
3 4 1 2 7 8 9 5 6
4 3 2 1 8 9 6 7 5
5 6 7 8 9 1 2 3 4
6 5 8 9 1 7 3 4 2
7 8 9 5 2 3 4 6 1
8 9 6 7 4 2 5 1 3
9 7 5 6 3 4 1 2 8
NO
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 3 8 4 5
8 5 4 3 9 6 1 2 7
NO
9 6 1 8 2 5 3 7 4
2 8 3 1 7 4 5 6 9
5 4 7 3 6 9 1 2 8
1 2 8 9 3 6 7 4 5
3 7 5 4 8 1 6 9 2
6 9 4 2 5 7 8 1 3
8 1 2 7 4 3 9 5 6
7 3 6 5 9 2 4 8 1
4 5 9 6 1 8 2 3 7
YES

해결방법

0~9 인덱스를 나타내는 리스트를 생성하거나 딕셔너리를 생성하여 반복문을 돌아서 각행 그리고 각열을 더해서 “최대값”이 반복하여 더한 번 수 보다 큰 것이 있는지 확인을 한다.

그리고 한 구역을 확인하는 방법은 4중 for 문을 돌려서 이용한다.

안쪽의 for 문 2개는 영역의 9개를 접근하는 것이고, 바깥의 for 문 2개는 다른 영역에 접근하기 위해서 사용한다.


코드

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

flag = False

# 행, 열 확인
for i in range(9):
    ch = []
    for j in range(9):
        ch.append(arr[i][j])
        ch.append(arr[j][i])
    # 최대 숫자 1보다
    if max(Counter(ch).values()) > 2:
        flag = True
        print('NO')
        break

# 스도쿠 4중 for 문
if not flag:
    for i in range(3):
        for j in range(3):
            ch = []
            for k in range(3):
                for l in range(3):
                    ch.append(arr[i*3+k][j*3+l])
            if max(Counter(ch).values()) > 1:
                flag = True
                print('NO')
                break
        if flag:
            break
    else:
        print('YES')

댓글남기기