[파이썬 알고리즘 문제풀이] - Section3 / 탐색 & 시뮬레이션 -10

Chooooo·2023년 1월 25일
0

🎈 스토쿠 검사

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

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

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

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

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

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

#스도쿠 검사
# 결국 중복이 있는지 확인.
#중복이 있는지 확인하기 위해 체크 리스트 3개. 행, 열, 그룹 총 3개가 필요
#이렇게 중복 감지하는 체크리스트를 쓸 수 있는 이유는 
# 1~9까지만 넣을 수 있기에 간단하게 이렇게만 해줄 수 있음.
def check(data): #2차원 리스트 들어오면 실행
    for i in range(9):
        ch1 = [0] * 10   
        ch2 = [0] * 10
        for j in range(9):
            ch1[data[i][j]] = 1 #행
            ch2[data[j][i]] = 1 #열
        if sum(ch1) != 9 or sum(ch2) != 9:
            return False

    #이제 그룹 탐색
    for i in range(3):
        for j in range(3):  #i, j를 통해 몇번째 그룹인지 확인할거야.
            ch3 = [0] * 10
            for k in range(3):
                for s in range(3):
                    ch3[data[i*3 + k][j*3 + s]] = 1
            if sum(ch3) != 9:
                return False
    return True

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

🎃 코멘트
중복을 확인하는 체크 리스트 3개가 필요했다. 4중 반복문, 해당 그룹의 인덱스 접근에서 인덱스 규칙 파악하는 것만 잘했어도 풀 수 있었다. 규칙성 파악 제대로 하도록 노력할 것.

profile
back-end, 지속 성장 가능한 개발자를 향하여

0개의 댓글