접근방법
- 백트래킹을 사용하는데 모든 칸을 확인한다.
- 칸을 확인하면서 빈칸인 부분에 들어갈 수 있는 숫자를 구한다.
- 숫자를 칸에 넣고 백트래킹~ 후 다시 복귀
입 / 출력
입력 | 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
5 3 4 6 7 8 9 1 2 6 7 2 1 9 5 3 4 8 1 9 8 3 4 2 5 6 7 8 5 9 7 6 1 4 2 3 4 2 6 8 5 3 7 9 1 7 1 3 9 2 4 8 5 6 9 6 1 5 3 7 2 8 4 2 8 7 4 1 9 6 3 5 3 4 5 2 8 6 1 7 9 |
0 0 3 0 2 0 6 0 0 9 0 0 3 0 5 0 0 1 0 0 1 8 0 6 4 0 0 0 0 8 1 0 2 9 0 0 7 0 0 0 0 0 0 0 8 0 0 6 7 0 8 2 0 0 0 0 2 6 0 9 5 0 0 8 0 0 2 0 3 0 0 9 0 0 5 0 1 0 3 0 0 |
5 0 0 0 0 8 0 0 0 0 3 0 0 0 0 0 0 4 0 0 7 0 0 0 0 0 0 0 6 0 0 0 0 0 0 0 0 0 0 0 9 0 0 0 0 0 0 0 0 0 0 0 5 0 0 0 0 0 0 0 4 0 0 9 0 0 0 0 0 0 2 0 0 0 0 6 0 0 0 0 1 |
출력 | 1 2 3 4 5 6 7 8 9 4 5 7 8 1 9 2 3 6 6 9 8 3 2 7 1 5 4 2 1 4 5 3 8 6 9 7 3 8 6 7 9 1 5 4 2 5 7 9 6 4 2 3 1 8 7 3 1 9 6 4 8 2 5 8 4 5 2 7 3 9 6 1 9 6 2 1 8 5 4 7 3 |
5 3 4 6 7 8 9 1 2 6 7 2 1 9 5 3 4 8 1 9 8 3 4 2 5 6 7 8 5 9 7 6 1 4 2 3 4 2 6 8 5 3 7 9 1 7 1 3 9 2 4 8 5 6 9 6 1 5 3 7 2 8 4 2 8 7 4 1 9 6 3 5 3 4 5 2 8 6 1 7 9 |
4 8 3 9 2 1 6 5 7 9 6 7 3 4 5 8 2 1 2 5 1 8 7 6 4 9 3 5 4 8 1 3 2 9 7 6 7 2 9 5 6 4 1 3 8 1 3 6 7 9 8 2 4 5 3 7 2 6 8 9 5 1 4 8 1 4 2 5 3 7 6 9 6 9 5 4 1 7 3 8 2 |
5 1 2 3 4 8 6 7 9 6 3 8 2 7 9 5 1 4 4 9 7 1 5 6 2 3 8 1 6 3 4 2 5 8 9 7 2 7 5 8 9 1 3 4 6 8 4 9 7 6 3 1 5 2 3 2 1 9 8 7 4 6 5 9 8 6 5 1 4 7 2 3 7 5 4 6 3 2 9 8 1 |
코드
더보기
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
static int map[][];
static boolean back() {
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
if (map[i][j] == 0) {
boolean[] check = new boolean[9];
for (int k = 0; k < 9; k++) {
if (map[k][j] != 0)
check[map[k][j] - 1] = true;
}
for (int k = 0; k < 9; k++) {
if (map[i][k] != 0)
check[map[i][k] - 1] = true;
}
int nextY = i / 3 * 3;
int nextX = j / 3 * 3;
for (int k = 0; k < 3; k++) {
for (int l = 0; l < 3; l++) {
if (map[nextY + k][nextX + l] != 0) {
check[map[nextY + k][nextX + l] - 1] = true;
}
}
}
for (int k = 0; k < 9; k++) {
if (!check[k]) {
map[i][j] = k + 1;
if (back()) {
return true;
}
map[i][j] = 0;
}
}
return false;
}
}
}
return true;
}
public static void main(String[] args) throws IOException {
// BufferedReader br = new BufferedReader(new FileReader("input.txt")); 파일입출력 테스트
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
map = new int[9][9];
for (int i = 0; i < 9; i++) {
String[] line = br.readLine().split(" ");
for (int j = 0; j < 9; j++) {
map[i][j] = Integer.parseInt(line[j]);
}
}
if (back()) {
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
System.out.print(map[i][j] + " ");
}
System.out.println();
}
}
}
}
'개인 공부 > 백준' 카테고리의 다른 글
11401번 이항 계수 3 (1) | 2024.09.08 |
---|---|
2156번 포도주 시식 ( JAVA ) (1) | 2024.09.04 |
14888번 연산자 끼워넣기 ( JAVA ) (1) | 2024.09.02 |
2346번 풍선 터뜨리기 ( JAVA ) (0) | 2024.09.01 |
11478번 서로 다른 부분 문자열의 개수 ( JAVA ) (2) | 2024.08.31 |