[JAVA] 백준 2580번 스도쿠
[HAVE TO DO]
STUDYING : JAVA
문제링크 : https://www.acmicpc.net/problem/2580
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class Main {
static int[][] sudoku = new int[9][9]; // 스도쿠 판
static ArrayList<Integer> point = new ArrayList<Integer>();
static int zeroNum = 0;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
sudoku[i][j] = Integer.parseInt(st.nextToken());
if(sudoku[i][j] == 0) {
zeroNum++;
point.add(i);
point.add(j);
}
}
if(i == 8) break;
st = new StringTokenizer(br.readLine());
}
dfs(0, 0);
}
static boolean chk_row(int col, int num) {
for (int row = 0; row < 9; row++) {
if(sudoku[row][col] == num) return false;
}
return true;
}
static boolean chk_col(int row, int num) {
for (int col = 0; col < 9; col++) {
if(sudoku[row][col] == num) return false;
}
return true;
}
static boolean chk_box(int row, int col, int num) {
int r = row - (row % 3);
int c = col - (col % 3);
for (int i = r; i < r + 3; i++) {
for (int j = c; j < c + 3; j++) {
if(sudoku[i][j] == num) return false;
}
}
return true;
}
static boolean isPossible(int row, int col, int num) {
if(chk_row(col, num) && chk_col(row, num) && chk_box(row, col, num)) {
return true;
} else return false;
}
static void dfs(int index, int cnt) {
if(cnt == zeroNum) {
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
System.out.print(sudoku[i][j] + " ");
}
System.out.print("\n");
}
} else {
int row = point.get(index);
int col = point.get(index+1);
for (int num = 1; num <= 9; num++) {
if(isPossible(row, col, num)) {
sudoku[row][col] = num;
dfs(index+2, cnt+1);
sudoku[row][col] = 0;
}
}
}
}
}
처음엔 이렇게 제출했는데 1% 뜨자마자 틀렸다고 떴다.
왜인지 찾아보니 경우의 수가 많으면 가능한 모든 경우의 수를 출력하기 때문이었다.
그래서 첫 번째 가능한 경우의 수를 출력한 후에 System.exit(0);으로 프로세스를 끝내버렸다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class Main {
static int[][] sudoku = new int[9][9]; // 스도쿠 판
static ArrayList<Integer> point = new ArrayList<Integer>();
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
sudoku[i][j] = Integer.parseInt(st.nextToken());
if(sudoku[i][j] == 0) {
point.add(i);
point.add(j);
}
}
if(i == 8) break;
st = new StringTokenizer(br.readLine());
}
dfs(0, 0);
}
static boolean chk_row(int col, int num) {
for (int row = 0; row < 9; row++) {
if(sudoku[row][col] == num) return false;
}
return true;
}
static boolean chk_col(int row, int num) {
for (int col = 0; col < 9; col++) {
if(sudoku[row][col] == num) return false;
}
return true;
}
static boolean chk_box(int row, int col, int num) {
int r = row - (row % 3);
int c = col - (col % 3);
for (int i = r; i < r + 3; i++) {
for (int j = c; j < c + 3; j++) {
if(sudoku[i][j] == num) return false;
}
}
return true;
}
static boolean isPossible(int row, int col, int num) {
if(chk_row(col, num) && chk_col(row, num) && chk_box(row, col, num)) {
return true;
} else return false;
}
static void dfs(int index, int cnt) {
if(cnt == (point.size() / 2)) {
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
System.out.print(sudoku[i][j] + " ");
}
System.out.print("\n");
}
System.exit(0);
} else {
int row = point.get(index);
int col = point.get(index+1);
for (int num = 1; num <= 9; num++) {
if(isPossible(row, col, num)) {
sudoku[row][col] = num;
dfs(index+2, cnt+1);
sudoku[row][col] = 0;
}
}
}
}
}
dfs를 사용해서 구현했고 0으로 입력된 곳만 탐색하는 방법을 선택했다.
'OTHER THINGS > STUDY STH' 카테고리의 다른 글
[JAVA] 백준 2042번 구간 합 구하기 (0) | 2020.09.03 |
---|---|
[JAVA] 백준 2014번 소수의 곱 (0) | 2020.08.29 |
[JAVA] 백준 1991번 트리 순회 (0) | 2020.08.22 |
[JAVA] 백준 15686번 치킨 배달 (0) | 2020.08.21 |
[JAVA] 백준 1103번 게임 (0) | 2020.08.20 |