CodingTest

SWEA - 스도쿠 검증(1974)

취업하고싶다! 2023. 10. 21. 21:45
 

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)