SWEA - 스도쿠 검증(1974)
문제
스도쿠는 숫자퍼즐로, 가로 9칸 세로 9칸으로 이루어져 있는 표에 1 부터 9 까지의 숫자를 채워넣는 퍼즐이다.
같은 줄에 1 에서 9 까지의 숫자를 한번씩만 넣고, 3 x 3 크기의 작은 격자 또한, 1 에서 9 까지의 숫자가 겹치지 않아야 한다.
입력으로 9 X 9 크기의 스도쿠 퍼즐의 숫자들이 주어졌을 때, 위와 같이 겹치는 숫자가 없을 경우, 1을 정답으로 출력하고 그렇지 않을 경우 0 을 출력한다.
[제약 사항]
1. 퍼즐은 모두 숫자로 채워진 상태로 주어진다.
2. 입력으로 주어지는 퍼즐의 모든 숫자는 1 이상 9 이하의 정수이다.
접근방식
arr 변수에 스도쿠 값들을 2차원 배열로 저장
그리고 valid 라는 변수에 True 값 할당
확인해야 될 부분은 3가지 - 행, 열, 사각형 부분이 1~9로 이뤄졌는지.
먼저 행과 열부터 확인
for 문을 9번 돌리면서 row_arr와 col_arr를 빈 배열([])로 할당
row_arr.append(arr[j][k]), col_arr.append(arr[k][j])를 통해 입력받은 값들을 각각 배열에 저장
이중 for문 중 안쪽의 for문을 9번 돌았으면 row_arr와 col_arr를 오름차순으로 정렬
그리고 이 정렬된 리스트가 [1,2,3,4,5,6,7,8,9]가 아니면 valid = False 로 주고 break를 통해 for문을 빠져나감(조건에서 탈락하므로 이후의 값들을 볼 필요가 없음)
만약 정렬된 리스트가 [1,2,3,4,5,6,7,8,9]와 같다면 조건을 충족하는 것
row_arr와 col_arr를 빈 배열로 초기화해주고 for j in range(9) 조건문을 다시 돎
만약 행과 열 모두 조건을 만족하면 이제 확인해야 할 것은 사각형 부분
for x in range(0, 9, 3)을 통해 8까지 3의 간격으로 for문을 돌리고(각 행, 열에서 3개씩 더해야하므로)
square_arr 를 빈 배열로 설정
안에서 for문을 한 번 더 돌면서 square_arr.extend(arr[y][x:x+3])을 통해 사각형의 값들을 square_arr에 할당
(ex: x = 0, y = 0이면 arr[0][0:3] 이므로 arr[0][0], arr[0][1], arr[0][2] 값을 square_arr에 할당. 그리고 y= 1 이 되고 arr[1][0], arr[1][1], arr[1][2]이 square_arr에 할당, y=2 가 되고 arr[2][0], arr[2][1], arr[2][2]가 square_arr에 할당
if y == 2 or y == 5 or y == 8 조건을 통해 사각형 크기만큼 배열에 할당(3x3= 9개)
그리고 square_arr.sort()를 통해 오름차순으로 정렬 후 이 배열이 [1,2,3,4,5,6,7,8,9]와 다르면 valid = False를 주고 break를 통해 for문을 빠져나옴
같다면 square_arr를 빈배열로 초기화 후 for문 다시 돎
for x in range(0, 9, 3)을 통해 x = 3이 되므로 배열의 4번째 인덱스부터 시작
cf) extend를 쓴 이유는 원래 배열에 추가하는 append()를 쓰게 되면 [[1,2,3], [4,5,6], [7,8,9]] 이렇게 2중 배열로 들어가기때문에 extend를 사용
코드
T = int(input())
for i in range(1, T+1):
arr = [list(map(int, input().split())) for _ in range(9)]
valid = True
for j in range(9):
row_arr = []
col_arr = []
for k in range(9):
row_arr.append(arr[j][k])
col_arr.append(arr[k][j])
row_arr.sort()
col_arr.sort()
if row_arr != [1,2,3,4,5,6,7,8,9] or col_arr != [1,2,3,4,5,6,7,8,9]:
valid = False
break
else:
row_arr = []
col_arr = []
for x in range(0, 9, 3):
square_arr = []
for y in range(9):
square_arr.extend(arr[y][x:x+3])
if y == 2 or y == 5 or y == 8:
square_arr.sort()
if square_arr != [1,2,3,4,5,6,7,8,9]:
valid = False
break
else:
square_arr = []
if valid:
print('#'+str(i), 1)
else:
print('#'+str(i), 0)