티스토리 뷰
https://www.acmicpc.net/problem/2580
2239번 스도쿠 (똑같은 문제)
const fs = require('fs');
let board = require('fs')
.readFileSync('./dev/stdin')
.toString()
.trim()
.split('\n')
.map((v) => v.split('').map(Number));
const zero = [];
for (let i = 0; i < 9; i++) {
for (let j = 0; j < 9; j++) {
if (board[i][j] == 0) {
zero.push([i, j]);
}
}
}
function dfs(now) {
if (now == zero.length) {
console.log(board.map((v) => v.join('')).join('\n'));
process.exit();
}
const [x, y] = zero[now];
for (let i = 1; i < 10; i++) {
if (check(x, y, i)) {
board[x][y] = i;
dfs(now + 1);
board[x][y] = 0;
}
}
}
dfs(0);
function check(x, y, n) {
for (let i = 0; i < 9; i++) {
if (board[x][i] == n) return false;
}
for (let i = 0; i < 9; i++) {
if (board[i][y] == n) return false;
}
const X = Math.floor(x / 3) * 3;
const Y = Math.floor(y / 3) * 3;
for (let i = X; i < X + 3; i++) {
for (let j = Y; j < Y + 3; j++) {
if (board[i][j] == n) return false;
}
}
return true;
}
// 이거는 옛날에 풀었던 풀이;;
const fs = require('fs');
let input = fs.readFileSync("/dev/stdin").toString().trim().split("\n").map(v=>v.split(' ').map(v=>+v));;
//정답 보여주기
function showAnswer(x){
let answer = x.map(v=>v.join(' ')).join('\n')
console.log(answer)
}
// 비어 있는 부분 찾기
const zero=[];
for(let i =0; i<9; i++){
for(let j = 0; j<9; j++){
if(input[i][j]==0){
zero.push([j,i])
}
}
}
//강제종료 어떻게 해야할지 모르겠음..
//그래서 일단 전역변수 하나 만들음
let exit =false;
dfs(0,input)
//dfs
function dfs(cnt,sudoku){
if(cnt==zero.length){
showAnswer(sudoku);
exit=true;
return;
}
if(!exit){
const [x,y] = zero[cnt];
for(let i = 1; i<10; i++){
if(check(x,y,i,sudoku)){
sudoku[y][x] = i;
dfs(cnt+1,sudoku);
sudoku[y][x]=0;
}
}
}
return;
}
//백트래킹 체크
function check(x,y,n,board){
//x: column, 가로방향 좌표
//y: row, 세로방향 좌표
//n: 현재 확인해야하는 값
//board: 스도쿠 판.
for(let i= 0; i<9; i++){
if(board[i][x]==n) return false;
}
for(let i = 0; i<9; i++){
if(board[y][i]==n) return false;
}
const X = Math.floor(x/3)*3;
const Y = Math.floor(y/3)*3;
for(let i = Y; i<Y+3; i++){
for( let j = X; j<X+3; j++){
if(board[i][j]==n) return false;
}
}
return true;
}
728x90
'자료구조 알고리즘 > 백준' 카테고리의 다른 글
Node.js) 백준 14889번 : 스타트와 링크 (0) | 2021.09.09 |
---|---|
Node.js) 백준 14888번 : 연산자 끼워넣기 (0) | 2021.09.09 |
Node.js) 백준 9663번 : N-Queen ★ (0) | 2021.09.08 |
Node.js) 백준 15652번 : N과 M (4) (0) | 2021.09.08 |
Node.js) 백준 15651번 : N과 M (3) (0) | 2021.09.08 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- MOD
- 로드나인
- 면접비
- 투포인터
- 투포인터 연습
- DB 생성
- create db
- 그래프
- 최소공통조상
- 개발자면접
- node.js
- 서버개발
- 다이나밍프로그래밍
- create databases;
- 동적프로그래밍
- MySQL
- 다이나믹프로그래밍
- 면접질문
- BFS
- 롱베케이션
- 은둔청년체험
- 서버점검
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함