[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검사를 위한 함수를 완벽하게 이해해보기
-> 그림으로 표현해봤습니다. 참고하세요
*)
어떤 피드백이든 댓글부탁드립니다.
더 좋은 방법이 있다면 알려주세요.
도움이 되셨다면, 하트버튼 또는 댓글부탁드려요~
요청할 문제가 있다면 댓글 부탁드려요!!!
*(
'python > 파이썬 예제' 카테고리의 다른 글
파이썬 리스트 다중 조건 정렬(python Multiple conditions sort) (0) | 2021.04.28 |
---|---|
파이썬으로 최빈값 구하기 - list사용(최빈값 1개 vs 여러개) [#4-2] (2) | 2020.04.18 |
파이썬 행의 합, 열의합, 최대값 구하는 함수[#5] (0) | 2020.03.21 |
파이썬 최빈값 구하시-dictionary 사용 [#4-1] (0) | 2020.03.18 |
[python example #3] 숫자 순으로 리스트 합치기(중복제거list 합치기) (0) | 2020.03.16 |