https://www.codewars.com/kata/529bf0e9bdf7657179000008/train/python
Sudoku Solution Validator
스도쿠는 숫자 퍼즐로 가로 9칸, 세로 9칸으로 이루어져 있는 표에 1부터 9까지의 숫자를 채워 넣는 퍼즐입니다.
퍼즐을 푸는 방법은 같은 줄에는 1에서 9까지의 숫자를 한 번만 넣고, 3x3칸의 작은 격자 또한 1에서 9까지의 숫자가 겹치지 않게 들어가야 합니다.
이 문제는 스도쿠 배열을 받았을 때 정답인지 아닌지를 검사하여 정답이면 True 정답이 아니면 False를 반환해야 하는 문제입니다.
가로줄, 세로줄 및 3x3에 1에서 9까지의 숫자가 있는지 알아야 하기에 숫자를 비교하기 위하여 중복되지 않는 set을 하나 만들어 줍니다.
nums = set(range(1, 10))
|
가로줄을 한 줄씩 검사를 하기 위해서는 가로줄을 한 줄씩 뽑아내어서 nums에 있는 수와 같은지 확인해야 합니다.
nums와 같으면 True를 출력하고 nums와 다르면 False와 출력하도록 해보겠습니다.
nums = set(range(1, 10))
# 가로줄 검사
for i in board:
print(set(i) == nums)
|
이 값들 중에 False가 존재한다면 False를 반환해도 무방합니다. 이 것을 코드로 나타내면 다음과 같습니다.
nums = set(range(1, 10))
# 가로줄 검사
if False in [set(i) == nums for i in board]:
return False
|
세로줄 역시 가로줄과 비슷합니다. 가로줄에서는 board를 순서대로 추출했던 것을 세로줄에서는 zip을 이용하여 순서대로 추출하면 됩니다. 추출한 후 위에서 했었던 nums와 비교하여 다르면 False를 반환하도록 코드를 제작합니다.
nums = set(range(1, 10))
# 세로줄 검사
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(0, 3)
for y in range(0, 3)]
# 3x3 검사
if False in squares:
return False
|
전체 코드
# My Code
def valid_solution(board):
nums = set(range(1, 10))
# 가로줄 검사
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(0, 3)
for y in range(0, 3)]
# 3x3 검사
if False in squares:
return False
return True
if __name__=='__main__':
print(valid_solution([[5, 3, 4, 6, 7, 8, 9, 1, 2],
[6, 7, 2, 1, 9, 5, 3, 4, 8],
[1, 9, 8, 3, 4, 2, 5, 6, 7],
[8, 5, 9, 7, 6, 1, 4, 2, 3],
[4, 2, 6, 8, 5, 3, 7, 9, 1],
[7, 1, 3, 9, 2, 4, 8, 5, 6],
[9, 6, 1, 5, 3, 7, 2, 8, 4],
[2, 8, 7, 4, 1, 9, 6, 3, 5],
[3, 4, 5, 2, 8, 6, 1, 7, 9]]))
print(valid_solution([[5, 3, 4, 6, 7, 8, 9, 1, 2],
[6, 7, 2, 1, 9, 0, 3, 4, 9],
[1, 0, 0, 3, 4, 2, 5, 6, 0],
[8, 5, 9, 7, 6, 1, 0, 2, 0],
[4, 2, 6, 8, 5, 3, 7, 9, 1],
[7, 1, 3, 9, 2, 4, 8, 5, 6],
[9, 0, 1, 5, 3, 7, 2, 1, 4],
[2, 8, 7, 4, 1, 9, 6, 3, 5],
[3, 0, 0, 4, 8, 1, 1, 7, 9]]))
|
'알고리즘 > 코드워' 카테고리의 다른 글
[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 |