Skip to content

[Leetcode] 37. Sudoku Solver โ€‹

Problem โ€‹

๋ฌธ์ œ ๋งํฌ

์Šค๋„์ฟ  ๋ฌธ์ œ๋ฅผ ํ’€๋ฉด๋œ๋‹ค.

Solution โ€‹

DFS์— Backtracking์„ ์‘์šฉํ•œ ๋ฌธ์ œ

๋ฐฐ์—ด์„ '์—ด'๋ถ€ํ„ฐ ์ˆœ์ฐจ์ ์œผ๋กœ .์„ ๋งŒ๋‚ฌ์„๋•Œ 1~9๊นŒ์ง€ ๊ฐ’์„ ๋„ฃ์–ด๋ณด๋ฉด์„œ ์Šค๋„์ฟ ์˜ ์กฐ๊ฑด์— ์˜ฌ๋ฐ”๋ฅธ์ง€ ํ™•์ธํ•œ๋‹ค.
๋งŒ์•ฝ ์กฐ๊ฑด์— ๋งž์ง€์•Š๋‹ค๋ฉด ๋ฐ”๋กœ ์ด์ „ ๊ฒฝ์šฐ์˜ ์ˆ˜๋กœ ๋Œ์•„๊ฐ€ ๋‹ค์Œ ์ผ€์ด์Šค๋ฅผ ๋„ฃ์–ด๋ณธ๋‹ค. ์ด ๋ฐฉ๋ฒ•์„ ์กฐ๊ฑด์ด ๋งž๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋‚˜์˜ฌ๋•Œ๊นŒ ์‹คํ–‰ํ•˜๋‹ค๊ฐ€ ๋ชจ๋“  ํ–‰๋ ฌ์„ ๋‹ค ๋Œ๋ฉด ๊ทธ๊ฐ’์„ ๋ฆฌํ„ดํ•œ๋‹ค.

JS Code โ€‹

javascript
/**
 * @param {character[][]} board
 * @return {void} Do not return anything, modify board in-place instead.
 */
var solveSudoku = function (board) {
  const N = 9
  function doSolveSudoku(grid, row, col) {
    // All checked matrix (row,col)
    if (row === N - 1 && col === N) return true

    // move row
    if (col === N) {
      row++
      col = 0
    }

    // next col
    if (grid[row][col] !== '.') return doSolveSudoku(grid, row, col + 1)

    // input 1~9 case
    for (let num = 1; num <= 9; num++) {
      if (isSafe(grid, row, col, num)) {
        grid[row][col] = `${num}`
        if (doSolveSudoku(grid, row, col + 1)) return true
      }
      grid[row][col] = '.'
    }
    return false
  }

  function isSafe(grid, row, col, num) {
    for (let x = 0; x < 9; x++) if (grid[row][x] == num) return false

    for (let y = 0; y < 9; y++) if (grid[y][col] == num) return false

    const startRow = row - (row % 3),
      startCol = col - (col % 3)
    for (let i = 0; i < 3; i++) for (let j = 0; j < 3; j++) if (grid[i + startRow][j + startCol] == num) return false

    return true
  }

  doSolveSudoku(board, 0, 0)
  return board
}