[PYTHON] 스도쿠 풀기

  • 문제

9 x 9인 matrix가 스도쿠가 완벽하게 풀려있는지, 실패인지 확인할 수 있는 코드를 작성하세요.

  • 알고리즘 표현

★WHY

스도쿠가 잘 풀려있다면, 3x3 box의 숫자가 1~9까지 빠짐없이 나와있어야하며,

각 row의 숫자가 1~9까지 빠짐없이 나와있어야하며,

각 column의 숫자가 1~9까지 빠짐없이 나와있어야한다.

 

★METHOD(그림참조)

A. 먼저, 3x3의 박스를 검사 -> def cross_check(matrix) 라는 함수를 만듬.

B. 다음, row(가로 한 줄) 검사 -> def row_check(matrix) 라는 함수를 만듬. 

C. 마지막, column(세로 한 줄) 검사 -> def column_check(matrix) 라는 함수를 만듬.

 

★DETAIL 상세 설명

*) 각각의 함수 검사방법

1. row, column 뿐만 아니라  box까지도 하나의 list로 만든다.자료형으로 만들어

2. 그 list를 set()자료형으로 바꾼다. -> set자료형은 {중복을 제거 & 오름차순 정렬}이 자동으로 이루어짐

3. 다시 list()자료형으로 바꾼다. -> 숫자가 중복이 제거되어, 순서대로 정렬되어 있을 것

4. 이 최종 list의 총 개수가 (len()함수사용) 9개 라면 1~9까지 빠짐없이 box, row, column에 있음을 알 수 있다.

참고) set()때문에 중복이 제거되어서 7개이면 1~7/2~8/3~9 이런식으로 있는 것!!!

 

★THEREFORE

이 A, B, C세가지 함수가 모두 True 라면 스도쿠는 잘 풀려있는 것이다.

정답이면 "RIGHT"를 틀렸다면 "NOT RIGHT"를 출력

 

  • input

위에 나온 사진과 같습니다.

 

matrix = [[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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
matrix = [list(map(int, input().split())) for _ in range(9)]
 
#print(matrix)
 
#A. 3 x 3 box 검사 -> 4중 for문 필요
def cross_check(matrix):
    i=0 #하나의 set를 만들기 위한 변수
     #3번 반복 : 
     #1set(0,1,2)행 > 총 3box
     #2set(3,4,5)행 > 총 3box
     #3set(6,7,8)행 > 총 3box
    for _ in range(3): # 총 3set
        s=0
        for _ in range(3): #한 set당 3개 box가 나옴
            my_list = [] #check할 list를 새로 생성
            
            #3x3 box 만들기
            for k in range(i,i+3): #3개의 행 for문
                for j in range(s,s+3): #한 행당 3개열 가져오기 (3x3 box이니까)
                    #print(j) # 중간 점검
                    my_list.append(matrix[k][j])
            #print(my_list) #중간 점검
            #box 하나 나옴
            my_list = set(my_list)
            my_list = list(my_list)
            if len(my_list) == 9 :
                s+=3 # 옆으로 3칸이동해 수행중인 set의 다음box검사
            else:
                return False
                break
        i+=3 #아래로 3칸이동해 다음 set 검사
    return True
#print(cross_check(matrix))
 
#B. row 검사
def row_check(matrix):
    for i in range(9):
        if len(list(set(matrix[i]))) == 9:
            continue
        else:
            return False
    return True
 
#print(row_check(matrix)) 
 
#C.column 검사
def column_check(matrix):
    for j in range(9):
        my_list = []
        for i in range(9):
            my_list.append(matrix[i][j])
        #print(my_list)
        if len(list(set(my_list))) == 9:
            continue
        else:
            return False
    return True
#print(column_check(matrix))
 
#최종 검사/ 모두 1~9까 빠짐없이 나와야(True) 스도쿠 검사 완료 
if cross_check(matrix) and row_check(matrix) and column_check(matrix):
    print("RIGHT")
else:
    print("NOT RIGHT")
cs

 

  • 배울코드

1. 3x3 box검사를 위한 함수를 완벽하게 이해해보기

-> 그림으로 표현해봤습니다. 참고하세요

 

*)

어떤 피드백이든 댓글부탁드립니다.

더 좋은 방법이 있다면 알려주세요.

도움이 되셨다면, 하트버튼 또는 댓글부탁드려요~

요청할 문제가 있다면 댓글 부탁드려요!!!

*(

+ Recent posts