"Boldness has genius, power, and magic in it." - Johann Wolfgang von Goethe

SWEA

[SWEA] 1974. 스도쿠 검증 코드 리뷰

Toproot 2021. 3. 30. 08:21
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