36. Valid Sudoku using JavaScript

0

Table of Contents

Problem

Determine if a 9 x 9 Sudoku board is valid. Only the filled cells need to be validated according to the following rules:

  1. Each row must contain the digits 1-9 without repetition.
  2. Each column must contain the digits 1-9 without repetition.
  3. Each of the nine 3 x 3 sub-boxes of the grid must contain the digits 1-9 without repetition.

Note:

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

Example 1:

Input: board = [[“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″]] Output: true

Example 2:Input: board = [[“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″]] Output: false Explanation: Same as Example 1, except with the 5 in the top left corner being modified to 8. Since there are two 8’s in the top left 3×3 sub-box, it is invalid.

Constraints:

  • board.length == 9
  • board[i].length == 9
  • board[i][j] is a digit 1-9 or '.'.

Solution

First attempt : (Can be optimized further)

/**
 * @param {character[][]} board
 * @return {boolean}
 */
var isValidSudoku = function(board) {
    // iterate through each row
    
    for(let i = 0; i < board.length;i++){
        let testSet = new Set(["1","2","3","4","5","6","7","8","9"]);
        for(let y = 0; y < board[i].length; y ++){
            if(board[i][y] == "."){
                continue;
            }
            if(!testSet.delete(board[i][y])){
               // console.log(board[i][y], " not found in ", testSet, testSet.delete(board[i][y]))
                return false;
            }
        }
    }
    // iterate through each column
    for(let i = 0; i < board[0].length; i++){
    let testSet = new Set(["1","2","3","4","5","6","7","8","9"]);
    for(let y = 0; y < board.length; y++){
        if(board[y][i] == "."){
            continue;
        }
        if(!testSet.delete(board[y][i])){
            return false;
        }
    }
}

    // iterate through each 3*3 block
    for(let block = 0; block < 9; block++){
        let testSet = new Set(["1","2","3","4","5","6","7","8","9"]);
        for(let i = 0; i < 3; i++){
            for(let j = 0; j < 3; j++){
                let rowIndex = 3 * Math.floor(block / 3) + i;
                let colIndex = 3 * (block % 3) + j;
                if(board[rowIndex][colIndex] == "."){
                    continue;
                }
                if(!testSet.delete(board[rowIndex][colIndex])){
                    return false;
                }
            }
        }
    }
    //console.log(board)
    return true;
};

Leave a Comment

Skip to content