Home Valid Sudoku
Post
Cancel

Valid Sudoku

Leetcode Problem

Valid Sudoku

유효한 스도쿠를 판별하는 문제입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Solution:
    def isValidSudoku(self, board: List[List[str]]) -> bool:
        for i in range(9):
            arr = []
            if not self.isValid(board[i]):
                return False
            for j in range(9):
                arr.append(board[j][i])
            if not self.isValid(arr):
                return False   
        for i in range(0, 9, 3):
            for j in range (0, 9, 3):
                arr = []
                for k in range(i, i + 3):
                    for l in range(j, j + 3):
                        arr.append(board[k][l])
                if not self.isValid(arr):
                    return False
        return True

    def isValid(self, arr: List[str]) -> bool:
        arr = [x for x in arr if x != '.']
        return len(arr) == len(set(arr))

행과 열, 3X3 사각형에 대해 1~9까지의 숫자가 한 번씩만 들어가는지 판별합니다.

1
2
3
4
5
6
7
8
9
class Solution(object):
    def isValidSudoku(self, board):
        res = []
        for i in range(9):
            for j in range(9):
                element = board[i][j]
                if element != '.':
                    res += [(i, element), (element, j), (i // 3, j // 3, element)]
        return len(res) == len(set(res))

solutions의 풀이입니다.

  1. (i, element)는 열이 일치하는 부분에 대해 검사합니다.
  2. (element, j)는 행이 일치하는 부분에 대해 검사합니다.
  3. (i // 3, j // 3, element)는 3X3 사각형에 대해 검사합니다. 3X3 사각형의 경우 예를 들면, 0, 0부터 3, 3까지의 숫자들은 // 연산에 의해 다 0, 0이 되므로 1~9까지의 수 중, 중복되는 수가 나온다면 set에서 겹치게 됩니다.





참고

This post is licensed under CC BY 4.0 by the author.