알고리즘/코드워

[python]Sudoku Solution Validator

(ㅇㅅㅎ) 2020. 4. 24. 22:35
728x90
반응형

https://www.codewars.com/kata/529bf0e9bdf7657179000008/train/python

 

Codewars: Train your coding skills

Codewars is where developers achieve code mastery through challenge. Train on kata in the dojo and reach your highest potential.

www.codewars.com

Sudoku Solution Validator

 

스도쿠는 숫자 퍼즐로 가로 9칸, 세로 9칸으로 이루어져 있는 표에 1부터 9까지의 숫자를 채워 넣는 퍼즐입니다.

퍼즐을 푸는 방법은 같은 줄에는 1에서 9까지의 숫자를 한 번만 넣고, 3x3칸의 작은 격자 또한 1에서 9까지의 숫자가 겹치지 않게 들어가야 합니다.

 

이 문제는 스도쿠 배열을 받았을 때 정답인지 아닌지를 검사하여 정답이면 True 정답이 아니면 False를 반환해야 하는 문제입니다.

 

가로줄, 세로줄 및 3x3에 1에서 9까지의 숫자가 있는지 알아야 하기에 숫자를 비교하기 위하여 중복되지 않는 set을 하나 만들어 줍니다.

nums = set(range(110))

 

가로줄을 한 줄씩 검사를 하기 위해서는 가로줄을 한 줄씩 뽑아내어서 nums에 있는 수와 같은지 확인해야 합니다.

nums와 같으면 True를 출력하고 nums와 다르면 False와 출력하도록 해보겠습니다.

nums = set(range(110))
# 가로줄 검사
for i in board:
    print(set(i) == nums)

 

이 값들 중에 False가 존재한다면 False를 반환해도 무방합니다. 이 것을 코드로 나타내면 다음과 같습니다.

nums = set(range(110))
# 가로줄 검사
if False in [set(i) == nums for i in board]:
    return False

 

세로줄 역시 가로줄과 비슷합니다. 가로줄에서는 board를 순서대로 추출했던 것을 세로줄에서는 zip을 이용하여 순서대로 추출하면 됩니다. 추출한 후 위에서 했었던 nums와 비교하여 다르면 False를 반환하도록 코드를 제작합니다.

nums = set(range(110))
# 세로줄 검사
if False in [set(i) == nums for i in zip(*board)]:
    return False
 

 

3x3의 경우는 (가로 1-3, 세로 1-3), (가로 4-6, 세로 1-3), (가로 7-9, 세로 1-3), (가로 1-3, 세로 4-6), (가로 4-6, 세로 4-6), (가로 7-9, 세로 4-6), (가로 1-3, 세로 7-9), (가로 4-6, 세로 7-9), (가로 7-9, 세로 7-9)이 각 각 nums와 같아야 합니다.

이것에 주의하여 코드를 제작합니다.

squares = [{board[i][j]
            for i in range(y * 3, y * 3 + 3)
            for j in range(x * 3, x * 3 + 3)} == nums
            for x in range(03)
            for y in range(03)]
# 3x3 검사
if False in squares:
    return False
 

 

전체 코드

# My Code
def valid_solution(board):
    nums = set(range(110))
    # 가로줄 검사
    if False in [set(i) == nums for i in board]:
        return False
 
    # 세로줄 검사
    if False in [set(i) == nums for i in zip(*board)]:
        return False
 
    squares = [{board[i][j]
                for i in range(y * 3, y * 3 + 3)
                for j in range(x * 3, x * 3 + 3)} == nums
                for x in range(03)
                for y in range(03)]
    # 3x3 검사
    if False in squares:
        return False
 
    return True
 
if __name__=='__main__':
    print(valid_solution([[534678912],
                          [672195348],
                          [198342567],
                          [859761423],
                          [426853791],
                          [713924856],
                          [961537284],
                          [287419635],
                          [345286179]]))
    print(valid_solution([[534678912],
                          [672190349],
                          [100342560],
                          [859761020],
                          [426853791],
                          [713924856],
                          [901537214],
                          [287419635],
                          [300481179]]))

반응형

'알고리즘 > 코드워' 카테고리의 다른 글

[python]Polish alphabet  (0) 2020.04.26
[python]Largest 5 digit number in a series  (0) 2020.04.25
[python]Get Planet Name By ID  (0) 2020.04.24
[python]Total amount of points  (0) 2020.04.22
[python]Expressions Matter  (0) 2020.04.20