Valid Sudoku

jun·2021년 5월 20일
1

Leetcode challenge

목록 보기
1/3
post-thumbnail

문제

입력으로 미완성 9 X 9 스도쿠가 주어질때 다음 규칙을 만족하는지 판단하는 문제

규칙

  1. 각 행에는 중복 없이 1-9의 숫자가 포함되어야한다.
  2. 각 열에는 중복 없이 1-9의 숫자가 포함되어야한다.
  3. 3 X 3 작은 사각형에는 중복 없이 1-9의 숫자가 포함되어야한다.

풀이

간단한 구현 문제. 행/열/작은 사각형이 유효한지 판단하는 함수 사용. 각각의 함수는 1-9의 숫자가 중복되어있는지 판단한다. 각각의 unit을 unit함수를 이용. 판단하게 함으로써 중복된 코드를 줄인다.

'''
Created by jun on 21/05/01
참고 : https://leetcode.com/problems/valid-sudoku/discuss/15451/A-readable-Python-solution
'''

class Solution:
    def is_column_valid(self, board):
        for column in zip(*board): #board를 unpacking하고 다시 zip하게 되면 column단위로 묶이게 된다.
            if not self.is_unit_valid(column):
                return False
        return True
            
    def is_row_valid(self, board):
        for row in board:
            if not self.is_unit_valid(row):
                return False
        return True
    
    def is_square_valid(self, board):
        for i in (0,3,6):
            for j in (0,3,6):
                square = [board[y][x] for x in range(j,j+3) for y in range(i,i+3)]
                if not self.is_unit_valid(square):
                    return False
        return True
        
        
    def is_unit_valid(self, unit): # 중복 체크함수
        unit = [i for i in unit if i != '.']
        return len(set(unit)) == len(unit) #중복 체크 팁
    
    def isValidSudoku(self, board: List[List[str]]) -> bool:
        return (self.is_column_valid(board) and 
                self.is_row_valid(board) and 
                self.is_square_valid(board))

새로 알게된 사실

zip 함수

  • 여러개의 순회 가능한 객체를 인자로 받아 각 객체가 담고있는 요소들을 차례차례 묶음으로 사용할 수 있도록 한다. packing한다.

* (Asterisk)

get 함수

  • dictionary 자료형에서 사용한다.
get(key, 해당 key값이 없을때 반환하는 값)

중복 여부 체크

len(set(unit)) == len(unit) 
profile
Computer Science / Algorithm / Project / TIL

0개의 댓글