ALGORITHM
백준 2580, 2239 스도쿠 (Java)
공부하는_다온
2023. 5. 1. 23:04
1. 문제 링크
2580번: 스도쿠
스도쿠는 18세기 스위스 수학자가 만든 '라틴 사각형'이랑 퍼즐에서 유래한 것으로 현재 많은 인기를 누리고 있다. 이 게임은 아래 그림과 같이 가로, 세로 각각 9개씩 총 81개의 작은 칸으로 이루
www.acmicpc.net
2239번: 스도쿠
스도쿠는 매우 간단한 숫자 퍼즐이다. 9×9 크기의 보드가 있을 때, 각 행과 각 열, 그리고 9개의 3×3 크기의 보드에 1부터 9까지의 숫자가 중복 없이 나타나도록 보드를 채우면 된다. 예를 들어 다
www.acmicpc.net
2. 문제 및 입출력예제
3. 문제 풀이
두 문제가 입출력의 공백 차이 뿐이라 함께 가져왔다.
dfs 느낌으로 이 숫자일 때 다음 숫자가 가능한지 그 다음은 가능한지... 의 순서로 코드를 진행한다.
4. 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
public class Main {
static class Point{
int x;
int y;
int num;
public Point(int x, int y, int num) {
super();
this.x = x;
this.y = y;
this.num = num;
}
}
static int[][] map;
static int idx;
static ArrayList<Point> blank;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
blank = new ArrayList<>();
map = new int[9][9];
for(int i=0;i<9;i++) {
String[] split = br.readLine().split("");
for(int j=0;j<9;j++) {
map[i][j] = Integer.parseInt(split[j]);
if(map[i][j] == 0) {
blank.add(new Point(i, j, 0));
}
}
}
sudoku(0);
for(int i=0;i<9;i++) {
for(int j=0;j<9;j++) {
sb.append(map[i][j]+"");
}
sb.append("\n");
}
System.out.println(sb);
}
private static boolean sudoku(int cnt) {
if(cnt == blank.size()) {//전부 다 채웠다면
return true;
}
Point p = blank.get(cnt);
int x = p.x;
int y = p.y;
for(int i=1;i<10;i++) {
if(possible(map, x, y, i)) {
map[x][y] = i;
if(sudoku(cnt+1)) return true;
map[x][y] = 0; //끝까지 못 가면 초기화
}
}
return false;
}
private static boolean possible(int[][] map, int x, int y, int num) {
int len = map.length;
int sero = x/3;
int garo = y/3;
//가로, 세로
for(int i=0;i<len;i++) { //이미 있는 숫자라면
if(map[x][i] == num) return false;
if(map[i][y] == num) return false;
}
for(int i=0;i<3;i++) {
for(int j=0;j<3;j++) {
if(map[sero*3+i][garo*3+j] == num) {
return false;
}
}
}
return true;
}
}