[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
}