백준 2580 스도쿠 (JAVA)
9x9 숫자를 입력받아 스도쿠를 완성하는 전형적인 백트래킹 문제
고찰
오랜만에 알고리즘을 풀어서 조금 헤맸다.
백트래킹만 잘 활용하면 크게 어려움은 없는 문제.
추가적으로 StringBuilder를 사용하지 않으면 시간초과가 발생함.
코드
import java.io.*;
import java.util.*;
public class Main_bj_2580_스도쿠 {
static int map[][];
static int flag = 0;
public static void main(String[] args) throws Exception {
System.setIn(new FileInputStream("res/input_2580.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
map = new int[9][9];
for (int i = 0; i < 9; i++) {
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
for (int j = 0; j < 9; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
sdoku(0, 0);
}
static void sdoku(int r, int c) {
if(flag == 1) return;
if (c == 9) {
sdoku(r + 1, 0);
return;
}
if (r == 9) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
sb.append(map[i][j]).append(" ");
}
sb.append("\n");
}
System.out.println(sb);
flag = 1;
return;
}
if (map[r][c] == 0) {
for (int n = 1; n <= 9; n++) {
if (check(r, c, n)) {
map[r][c] = n;
sdoku(r, c + 1);
}
}
map[r][c] = 0;
return;
}
sdoku(r, c + 1);
}
static boolean check(int r, int c, int num) {
// 가로
for (int i = 0; i < 9; i++) {
if (map[r][i] == num) return false;
}
// 세로
for (int i = 0; i < 9; i++) {
if (map[i][c] == num) return false;
}
// 3x3
int rr = (r / 3) * 3;
int cc = (c / 3) * 3;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (map[rr + i][cc + j] == num) return false;
}
}
return true;
}
}
'Algorithm > baekjoon' 카테고리의 다른 글
[백준] 21608 상어초등학교 (JAVA) (0) | 2022.06.30 |
---|---|
[백준] 2467 용액 (JAVA) (0) | 2022.06.16 |