728x90

LeetCode-36

Valid Sudoku : A Sudoku board (partially filled) could be valid but is not necessarily solvable.
note : Only the filled cells need to be validated according to the mentioned rules.

Answer

        :::python

class Solution: def isValidSudoku(self, board: List[List[str]]) -> bool: def valid_row(i, j, row): if row==1: item = board[i] else: item = [board[n][j] for n in range(0,9)] p = [] box = [board[i//32 + r][j//32 + c] for r in range(i//3, i//3+3) for c in range(j//3, j//3+3)] b = [] for i in range(0,9): if item[i] !='.': p.append(item[i]) if box[i] !='.': b.append(box[i]) if len(set(box))-1 == len(b): pass else: return False if len(set(item))-1 == len(p): return True else: return False for i in range(0,9): for j in range(0,9): if valid_row(i,j,0) and valid_row(i,j,1): pass else: return False return True

Result : 272ms Memory: 16.5mb


문제: μœ νš¨ν•œ μŠ€λ„μΏ 

이 λ¬Έμ œλŠ” 9x9 크기인 μŠ€λ„μΏ  κ²Œμž„μ΄ μœ νš¨ν•œμ§€ ν™•μΈν•˜λŠ” λ¬Έμ œμž…λ‹ˆλ‹€. 각 ν–‰, μ—΄, 그리고 μž‘μ€ 3x3 μ‚¬κ°ν˜•μ— 1~9의 μˆ«μžκ°€ ν•œ λ²ˆμ”©λ§Œ λ“±μž₯ν•˜λ©΄ μœ νš¨ν•œ μŠ€λ„μΏ μž…λ‹ˆλ‹€. μž…λ ₯으둜 이λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 9x9 λ¬Έμžμ—΄ 배열이 μ£Όμ–΄μ§‘λ‹ˆλ‹€.

ν•΄κ²°μ±…:

이 문제의 핡심은 각 ν–‰, μ—΄, μ‚¬κ°ν˜•μ— μ€‘λ³΅λœ μˆ«μžκ°€ μžˆλŠ”μ§€λ₯Ό ν™•μΈν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. μš°λ¦¬λŠ” 각 ν–‰, μ—΄, 그리고 μž‘μ€ μ‚¬κ°ν˜•μ„ 9κ°œμ”© 총 27개의 그룹으둜 λ‚˜λˆŒ 수 μžˆμŠ΅λ‹ˆλ‹€. 이 κ·Έλ£Ήλ“€ 쀑 ν•œ 그룹에 μ€‘λ³΅λœ μˆ«μžκ°€ μžˆλ‹€λ©΄ μŠ€λ„μΏ λŠ” μœ νš¨ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

λ”°λΌμ„œ, 각 그룹의 쀑볡 μ—¬λΆ€λ₯Ό μ²΄ν¬ν•˜λŠ” helper function valid_row λ₯Ό λ§Œλ“€κ³  이 ν•¨μˆ˜λ₯Ό μ΄μš©ν•΄μ„œ 각 ν–‰, μ—΄, μž‘μ€ μ‚¬κ°ν˜•μ— λŒ€ν•΄ μœ νš¨μ„±μ„ νŒλ‹¨ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

valid_row ν•¨μˆ˜μ—λŠ” 3개의 μΈμžκ°€ ν•„μš”ν•©λ‹ˆλ‹€. i 와 j λŠ” ν˜„μž¬ κ²€μ‚¬ν•˜κ³  μžˆλŠ” μ›μ†Œμ˜ μœ„μΉ˜λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€. row λŠ” 0, 1둜 λ‚˜λˆŒ 수 있으며, 각각 ν•΄λ‹Ή μ›μ†Œμ˜ ν–‰κ³Ό 열을 κ²€μ‚¬ν•˜λŠ” κ²½μš°μž…λ‹ˆλ‹€.

ν•¨μˆ˜λŠ” ν•΄λ‹Ή 그룹에 μ†ν•œ λͺ¨λ“  μ›μ†Œλ₯Ό λͺ¨μ€ item λ¦¬μŠ€νŠΈμ™€ 같은 μž‘μ€ μ‚¬κ°ν˜•μ— μ†ν•œ λͺ¨λ“  μ›μ†Œλ₯Ό λͺ¨μ€ box 리슀트λ₯Ό λ§Œλ“­λ‹ˆλ‹€. item κ³Ό box λ¦¬μŠ€νŠΈμ—μ„œ . λ₯Ό μ œμ™Έν•œ λͺ¨λ“  μ›μ†Œλ₯Ό p 와 b λ¦¬μŠ€νŠΈμ— μ €μž₯ν•©λ‹ˆλ‹€.

κ·Έλ¦¬κ³ λ‚˜μ„œ set 을 μ΄μš©ν•΄μ„œ μ€‘λ³΅λœ μˆ«μžκ°€ μžˆλŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€. λ§Œμ•½ μ€‘λ³΅λœ μˆ«μžκ°€ μžˆλ‹€λ©΄, ν•΄λ‹Ή 그룹이 μœ νš¨ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ§ˆμ§€λ§‰μœΌλ‘œ, ν•΄λ‹Ή 그룹이 μœ νš¨ν•˜λ‹€λ©΄ True λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

그리고 isValidSudoku λ©”μ†Œλ“œλŠ” 각 ν–‰, μ—΄, μž‘μ€ μ‚¬κ°ν˜•μ— λŒ€ν•΄μ„œ valid_row ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜κΈ°λ§Œ ν•˜λ©΄ λ©λ‹ˆλ‹€.

μ΄λ ‡κ²Œ μž‘μ„±ν•œ ν•΄κ²°μ±…μ˜ μ‹œκ°„λ³΅μž‘λ„λŠ” $O(81 \times (3 \times 9)) = O(2187)$ μ΄λ―€λ‘œ μΆ©λΆ„νžˆ νš¨μœ¨μ μž…λ‹ˆλ‹€.

μ•„λž˜λŠ” 주어진 μ½”λ“œμž…λ‹ˆλ‹€.

class Solution:
    def isValidSudoku(self, board: List[List[str]]) -> bool:
        def valid_row(i, j, row):
            if row==1:
                item = board[i]
            else:
                item = [board[n][j] for n in range(0,9)]
            p = []
            box = [board[i//3*3 + r][j//3*3 + c] for r in range(0,3) for c in range(0,3)]    
            b = []
            for i in range(0,9):
                if item[i] !='.':
                    p.append(item[i])
                if box[i] !='.':
                    b.append(box[i])
            if len(set(box))-1 == len(b):
                pass 
            else:
                return False
            if len(set(item))-1 == len(p):
                return True 
            else: 
                return False
        for i in range(0,9):
            for j in range(0,9):
                if valid_row(i,j,0) and valid_row(i,j,1):
                    pass
                else:
                    return False
        return True

μ½”λ“œ 리뷰:

주어진 μ½”λ“œλŠ” μœ„μ—μ„œ μ •μ˜ν•œ ν•΄κ²°μ±…κ³Ό ꡉμž₯히 μœ μ‚¬ν•©λ‹ˆλ‹€.

λ‹€λ§Œ, μž‘μ€ μ‚¬κ°ν˜•μ— λŒ€ν•œ box λ₯Ό λ§Œλ“€ λ•Œ 잘λͺ»λœ 인덱싱을 μ‚¬μš©ν•˜λŠ” 였λ₯˜κ°€ μžˆμŠ΅λ‹ˆλ‹€. box 의 μ›μ†Œμ˜ 인덱슀λ₯Ό 찾을 λ•Œμ—λŠ” 3을 κ³±ν•΄μ•Ό ν•˜λŠ”λ° 2둜 찾게 λ˜μ–΄μ„œ λ¬Έμ œκ°€ μƒκΉλ‹ˆλ‹€.

μ˜¬λ°”λ₯Έ μ½”λ“œ:

class Solution:
    def isValidSudoku(self, board: List[List[str]]) -> bool:
        def valid_row(i, j, row):
            if row==1:
                item = board[i]
            else:
                item = [board[n][j] for n in range(0,9)]
            p = []
            box = [board[i//3*3 + r][j//3*3 + c] for r in range(0,3) for c in range(0,3)]    
            b = []
            for i in range(0,9):
                if item[i] !='.':
                    p.append(item[i])
                if box[i] !='.':
                    b.append(box[i])
            if len(set(box))-1 == len(b):
                pass 
            else:
                return False
            if len(set(item))-1 == len(p):
                return True 
            else: 
                return False
        for i in range(0,9):
            for j in range(0,9):
                if valid_row(i,j,0) and valid_row(i,j,1):
                    pass
                else:
                    return False
        return True
λ°˜μ‘ν˜•

'🐒 One step' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[ngrok] ngrok 502 Bad Gateway 원인은 λ„ˆν•œν…Œ~  (0) 2024.01.10
[phpAdmin]  (0) 2023.07.29
[leetcode-242] Valid Anagram  (0) 2023.05.13
[leetcode-217] Contains Duplicate  (0) 2023.05.11
How to LeetCode effectively  (0) 2023.05.10
λ‹€ν–ˆλ‹€