Algorithm problem-06
23793 ワード
const sudoku = function (board) {
// 보드, 바꿔야할 숫자, 숫자의 위치 정보(r/c index값)
// 위의 정보를 같이 전달해 줘야 함
// 0인 위치 정보를 빈 배열에 저장, 저장한 값들을 꺼내서 사용
const emptySpot = (board) => {
let spot = []
for (let i = 0; i < board.length; i++) {
for (let j = 0; j < board[i].length; j++) {
if (board[i][j] === 0) {
spot.push([i, j])
}
}
}
}
// 가로를 검사하는 함수, boolean
// 변수의 보드에서의 위치에 따른 검사 행을 설정해야 함
const row = (board, r, n) => {
}
// 세로를 검사하는 함수, boolean
// 변수의 보드에서의 위치에 따른 검사 열을 설정해야 함
const column = (board, c, n) => {
}
// 3x3 블록을 검사하는 함수, boolean
// 변수의 보드에서의 위치에 따른 검사 블럭을 설정해야 함
const block = (board, r, c, n) => {
}
// 포문, 0일때 3가지 조건을 모두 통과하는 숫자로 바꿔서 대입
for (let i = 0; i < board.length; i++) {
for (let j = 0; j < board[i].length; j++) {
if (board[i][j] === 0) {
for (let k = 0; k <= 9; k++) {
if (row(k) && column(k) && block(k)) {
board[i][j] = k
}
}
}
}
}
// 포문이 끝나고 나오면 리턴 보드
return board;
};
// 3가지 조건이 존재
// 열, 행, 그리고 3X3 내에 중복되는 숫자가 없어야 함(1-9)
// 각각의 조건을 따로 판별하는 내부 함수를 만들고
// 0이 입력된 곳에 숫자를 변경하도록 구현
const sudoku = function (board) {
// 빈 칸을 찾아서 저장하는 함수, 빈 칸은 0으로 표현하였음
function nextEmptySpot(board) {
for (let i = 0; i < board.length; i++) {
for (let j = 0; j < board.length; j++) {
if (board[i][j] === 0) return [i, j];
}
}
return [-1, -1];
}
// row 열(가로)값을 돌아보는 함수이다.
function checkRow(board, row, value){
for(let i = 0; i < board[row].length; i++) {
if(board[row][i] === value) {
return false;
}
}
return true;
}
// col 행(세로)값을 돌아보는 함수이다.
function checkColumn(board, column, value){
for(let i = 0; i < board.length; i++) {
if(board[i][column] === value) {
return false;
}
}
return true;
};
// board의 [row, col]에 value값이 있는지 확인하는 함수이다.
function checkSquare(board, row, column, value){
boxRow = Math.floor(row / 3) * 3;
boxCol = Math.floor(column / 3) * 3;
for (let r = 0; r < 3; r++){
for (let c = 0; c < 3; c++){
if (board[boxRow + r][boxCol + c] === value) {
return false;
}
}
}
return true;
};
// value값을 확인하는 함수이다. row, col, square 모두 값이 같다면 true
function checkValue(board, row, column, value) {
if(checkRow(board, row, value) &&
checkColumn(board, column, value) &&
checkSquare(board, row, column, value)) {
return true;
}
return false;
};
let emptySpot = nextEmptySpot(board);
let row = emptySpot[0];
let col = emptySpot[1];
if (row === -1){
return board;
}
for(let num = 1; num <= board.length; num++){
if (checkValue(board, row, col, num)){
board[row][col] = num;
sudoku(board);
}
}
if (nextEmptySpot(board)[0] !== -1) {
board[row][col] = 0;
}
return board;
}
Reference
この問題について(Algorithm problem-06), 我々は、より多くの情報をここで見つけました https://velog.io/@ebiny/Algorithm-problem-06テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol