문제설명
- 9 X 9 크기의 스도쿠 보드가 유효한지 판단하라.
- 다음 규칙에 따라 보드의 칸이 채워져야 유효하다고 판정한다
- 각 행은 1-9까지의 숫자를 중복 없이 갖는다.
- 각 열은 1-9까지의 숫자를 중복 없이 갖는다.
- 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)