본문 바로가기

알고리즘풀이

LeetCode: Valid Sudoku

문제설명

  • 9 X 9 크기의 스도쿠 보드가 유효한지 판단하라.
  • 다음 규칙에 따라 보드의 칸이 채워져야 유효하다고 판정한다
  1. 각 행은 1-9까지의 숫자를 중복 없이 갖는다.
  2. 각 열은 1-9까지의 숫자를 중복 없이 갖는다.
  3. 3 x 3 의 작은 박스에서 1-9까지의 숫자를 중복 없이 갖는다.

문제풀이

func isValidSudoku(_ board: [[Character]]) -> Bool {

    var rows = Array.init(repeating: [Int: Int](), count: 9)
    var columns = Array.init(repeating: [Int: Int](), count: 9)
    var boxes = Array.init(repeating: [Int: Int](), count: 9)

    for i in 0..<9 {
        for j in 0..<9 {
            if let num = Int(String(board[i][j]))  {
                rows[i][num] = (rows[i][num] ?? 0) + 1
                columns[j][num] = (columns[j][num] ?? 0) + 1
                boxes[getBoxIdx(i, j)][num] = (boxes[getBoxIdx(i, j)][num] ?? 0) + 1
            }
        }
    }

    if 0 < rows.flatMap({ dict in dict.filter { k,v in v > 1 } }).count {
        return false
    }
    if 0 < columns.flatMap({ dict in dict.filter { k,v in v > 1 } }).count {
        return false
    }
    if 0 < boxes.flatMap({ dict in dict.filter { k,v in v > 1 } }).count {
        return false
    }

    return true

}

func getBoxIdx(_ i: Int, _ j: Int) -> Int {
    return (3*(i/3)) + (j/3)
}




var board1:[[Character]] = [["5","3",".",".","7",".",".",".","."]
                          ,["6",".",".","1","9","5",".",".","."]
                          ,[".","9","8",".",".",".",".","6","."]
                          ,["8",".",".",".","6",".",".",".","3"]
                          ,["4",".",".","8",".","3",".",".","1"]
                          ,["7",".",".",".","2",".",".",".","6"]
                          ,[".","6",".",".",".",".","2","8","."]
                          ,[".",".",".","4","1","9",".",".","5"]
                          ,[".",".",".",".","8",".",".","7","9"]]

isValidSudoku(board1)

var board2: [[Character]] = [["8","3",".",".","7",".",".",".","."]
                             ,["6",".",".","1","9","5",".",".","."]
                             ,[".","9","8",".",".",".",".","6","."]
                             ,["8",".",".",".","6",".",".",".","3"]
                             ,["4",".",".","8",".","3",".",".","1"]
                             ,["7",".",".",".","2",".",".",".","6"]
                             ,[".","6",".",".",".",".","2","8","."]
                             ,[".",".",".","4","1","9",".",".","5"]
                             ,[".",".",".",".","8",".",".","7","9"]]
isValidSudoku(board2)

'알고리즘풀이' 카테고리의 다른 글

Graph 탐색, Depth First Search  (0) 2021.05.02
LeetCode: Largest Unique Number  (0) 2021.04.05
LeetCode: MoveZeroes  (0) 2021.04.02
LeetCode: Plus One  (0) 2021.04.01
LeetCode: Intersection of Two Arrays II  (0) 2021.03.31