728x90
728x90
🎱 파이썬 SWEA-Problem[D-2] 1974.스도쿠 검증
- 주어진 9X9 배열을 가지고 스도쿠 검증을 합니다.
- 올바른 스도쿠 퍼즐일 경우 1을, 아닐경우 0을 출력합니다.
💡 아이디어
가로/세로, 블럭을 구분해서 카운팅정렬을 사용하여 스도쿠 퍼즐을 검증합니다.
가로와 세로는 하나의 for문으로 검증가능하여 한번에 검사하고, 블럭은 새로운 for문을 이용합니다.
검증의 용이성을 위해 sdoku 함수를 만들어 리스트와 num(1~9)를 입력받아 사용합니다.
🎲 파이썬 코드
※ SW Expert 아카데미의 문제를 무단 복제하는 것을 금지합니다.
T = int(input())
# 스도쿠 검사하는 함수
def sdoku(list, nums):
check = [0 for _ in range(9)] # 숫자 체크보드
for i in range(9):
for j in range(9):
if list[i] == nums[j]:
check[j] += 1
cnt = 0
for i in range(9):
if check[i] == 1: cnt +=1
if cnt == 9: return 1
return 0
for tc in range(1, T+1):
BRD = [list(map(int, input().split())) for _ in range(9)]
nums = [i for i in range(1, 10)] # 비교할 숫자 1~9
# 가로,세로 검사
row_cnt = 0
cul_cnt = 0
for i in range(9):
# 가로검사
if sdoku(BRD[i], nums) == 1: row_cnt +=1
# 세로검사
Cul = []
for j in range(9): Cul.append(BRD[j][i])
if sdoku(Cul, nums) == 1: cul_cnt +=1
# 한 블럭 검사
block_cnt = 0
for i in range(0, 9, 3):
for j in range(0, 9, 3):
# BRD[i][j] 좌표를 기준으로 한 블럭 탐색
block = []
for k in range(3):
for l in range(3):
block.append(BRD[i+k][j+l])
if sdoku(block, nums) == 1:
block_cnt += 1
# 가로,세로,블럭 모두가 9개씩이면 True
if row_cnt == 9 and cul_cnt == 9 and block_cnt == 9: print('#{} 1'.format(tc))
else: print('#{} 0'.format(tc))
* 제 코드가 정답은 아닙니다. 부족한 부분과 더 좋은 아이디어가 있으시면 댓글로 남겨주세요! :)
728x90
728x90
'SWEA' 카테고리의 다른 글
[SWEA] 1926. 간단한 369 게임 (0) | 2022.01.02 |
---|---|
[SWEA] 1859.백만장자 프로젝트 (0) | 2022.01.01 |
1225. [파이썬 S/W 문제해결 기본] 7일차 - 암호생성기 (0) | 2021.03.03 |
1224. [파이썬 S/W 문제해결 기본] 6일차 - 계산기3 (2) | 2021.03.03 |
4881. [파이썬 S/W 문제해결 기본] 5일차 - 배열 최소 합 (0) | 2021.03.03 |