문제

제약 사항
1. 퍼즐은 모두 숫자로 채워진 상태로 주어진다.
2. 입력으로 주어지는 퍼즐의 모든 숫자는 1 이상 9 이하의 정수이다.
입력
입력은 첫 줄에 총 테스트 케이스의 개수 T가 온다.
다음 줄부터 각 테스트 케이스가 주어진다.
테스트 케이스는 9 x 9 크기의 퍼즐의 데이터이다.
출력
테스트 케이스 t에 대한 결과는 “#t”을 찍고, 한 칸 띄고, 정답을 출력한다.
(t는 테스트 케이스의 번호를 의미하며 1부터 시작한다.)
문제에 대한 모든 권리는 SW Expert Academy에게 있습니다
아이디어
랄 건 없다...
그냥 가로, 세로, 3*3 각각 확인해주면 된다. ㅎㅎ
대신 세로를 확인할 때에는 굳이 어렵게 행을 바꿔가며 세지 않고, 가로와 세로를 뒤바꾼 전치행렬을 만들어서 처리했다.
코드
# 9*9 스도쿠를 확인하는 함수
def sudoku_check(arr):
for i in range(9): # 행고정
check = [0] * 9 # 카운팅 정렬을 위한 빈 리스트
for j in range(9):
for idx in range(1, 10):
if idx == arr[i][j]:
check[idx-1] += 1
# 카운팅 정렬한 리스트 내에 1보다 큰 값이 있다?
# => 하나가 두 번 나온 것
if max(check) > 1:
return False
return True
# 3*3 스도쿠를 확인하는 함수
def tt_check(arr):
# (0,0), (0,3), (0,6), ..., (6,6)이 시작점
for i in [0, 3, 6]:
for j in [0, 3, 6]:
check = [0] * 9
# 가로세로 3
for k in range(3):
for l in range(3):
# 카운팅 정렬
for idx in range(1, 10):
if idx == arr[i + k][j + l]:
check[idx-1] += 1
if max(check) > 1:
return False
return True
T = int(input())
for tc in range(1, 11):
puzzle = [list(map(int, input().split())) for _ in range(9)]
# print(puzzle)
# 가로로 탐색
row_check = sudoku_check(puzzle)
# 세로로 탐색 => 전치 행렬 사용
col_puzzle = list(map(list, zip(*puzzle)))
col_check = sudoku_check(col_puzzle)
# 3*3 탐색
tbyt_check = tt_check(puzzle)
# 최종 출력
print(f'#{tc} {row_check * col_check * tbyt_check}')
리뷰
더 잘 짤 수도 있겠지만... 22년 2월 27일의 나에게는 이게 최선
다음에 더 좋은 코드 짜면 추가하겠음
'Algorithm > SW Expert Amademy' 카테고리의 다른 글
| SWEA 1208. Flatten (파이썬) (0) | 2022.02.27 |
|---|---|
| 4835. 파이썬 S/W 문제해결(알고리즘) | 구간합 (0) | 2022.02.14 |
| 6209, 6216. 파이썬 연산자 연습 문제 (0) | 2022.01.25 |
| 6206. 파이썬 연산자 연습 문제 (0) | 2022.01.25 |
| 6314. 파이썬 내장함수 연습문제 2 (0) | 2022.01.16 |