본문 바로가기
CodingTest

SWEA - 스도쿠 검증(1974)

by 취업하고싶다! 2023. 10. 21.
 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

문제

스도쿠는 숫자퍼즐로, 가로 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)