규도자 개발 블로그
[SWEA/1974/파이썬3(python3)] 스도쿠 검증 본문
[SWEA/1974/파이썬3(python3)] 스도쿠 검증
문제
스도쿠는 숫자퍼즐로, 가로 9칸 세로 9칸으로 이루어져 있는 표에 1 부터 9 까지의 숫자를 채워넣는 퍼즐이다.
같은 줄에 1 에서 9 까지의 숫자를 한번씩만 넣고, 3 x 3 크기의 작은 격자 또한, 1 에서 9 까지의 숫자가 겹치지 않아야 한다.
입력으로 9 X 9 크기의 스도쿠 퍼즐의 숫자들이 주어졌을 때, 위와 같이 겹치는 숫자가 없을 경우, 1을 정답으로 출력하고 그렇지 않을 경우 0 을 출력한다.
제한사항
- 퍼즐은 모두 숫자로 채워진 상태로 주어진다.
- 입력으로 주어지는 퍼즐의 모든 숫자는 1 이상 9 이하의 정수이다.
입력
입력은 첫 줄에 총 테스트 케이스의 개수 T가 온다.
다음 줄부터 각 테스트 케이스가 주어진다.
테스트 케이스는 9 x 9 크기의 퍼즐의 데이터이다.
10
7 3 6 4 2 9 5 8 1
5 8 9 1 6 7 3 2 4
2 1 4 5 8 3 6 9 7
8 4 7 9 3 6 1 5 2
1 5 3 8 4 2 9 7 6
9 6 2 7 5 1 8 4 3
4 2 1 3 9 8 7 6 5
3 9 5 6 7 4 2 1 8
6 7 8 2 1 5 4 3 9
…
출력
출력의 각 줄은 '#t'로 시작하고, 공백을 한 칸 둔 다음 정답을 출력한다.
(t는 테스트 케이스의 번호를 의미하며 1부터 시작한다.)
#1 1
...
풀이
case_count = int(input())
for i in range(1, case_count + 1):
matrix = [list(map(int, input().split())) for _ in range(9)]
result = 1
# 가로세로
for row_index, row in enumerate(matrix):
as_col = []
if len({*row}) != 9:
result = 0
break
else:
for col in range(9):
as_col.append(matrix[col][row_index])
if len({*as_col}) != 9:
result = 0
break
# 블록
if result:
for col in range(0, 9, 3):
for row in range(0, 9, 3):
block_numbers = []
for j in range(3):
for k in range(3):
block_numbers.append(matrix[col+j][row+k])
if len({*block_numbers}) != 9:
result = 0
break
print('#{} {}'.format(i, result))
설명
오랜만에 풀면서 재밌었던 문제를 만나서 남겨두려 한다. 제목에서 볼 수 있다시피 채워진 스도쿠가 주어지면 그것이 정상적으로 완성된 스도쿠인지 검증하는 문제이다. 가로, 세로, 블록 형태로 숫자들을 수집하는 건 위 풀에서와 같은 반복문으로 해결하였고 해당 숫자들에 중복이 없는지 검증하는 것은 가로, 세로, 블록형태로 진행되는 반복문들에서 마주치는 숫자들을 리스트에 저장해놨다가 그 리스트를 튜플화시켰을 때 해당 숫자들의 길이를 잼으로써 처리하였다. 중복된 데이터를 허용하지 않는 튜플의 특성상 중복데이터가 있다면 그 길이가 9 미만일 것이기 때문에 만약에 그 길이가 9 미만이면 함수의 진행을 멈추는 식으로 작성하였다.
'알고리즘 > 풀이' 카테고리의 다른 글
[SWEA/12741/파이썬3(python3)] 두 전구 (0) | 2021.09.29 |
---|---|
[SWEA/1961/파이썬3(python3)] 숫자 배열 회전 (0) | 2021.09.07 |
[SWEA/2007/파이썬3(python3)] 패턴 마디의 길이 (0) | 2021.08.25 |
[프로그래머스/Level1/파이썬3(python3)] 직업군 추천하기 (0) | 2021.08.23 |
[프로그래머스/Level2/파이썬3(python3)] 튜플 (0) | 2021.08.08 |
Comments