728x90
https://www.acmicpc.net/problem/2580
메모리: 89,044 KB , 시간: 280 ms
사용 알고리즘: 구현, 백트래킹
728x90
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
static int[][] sudoku;
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
sudoku = new int[9][9];
for (int i = 0; i < 9; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < 9; j++) {
sudoku[i][j] = Integer.parseInt(st.nextToken());
}
}
backTracking(0, 0);
StringBuilder result = new StringBuilder();
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
result.append(sudoku[i][j]).append(" ");
}
result.append("\n");
}
System.out.print(result);
}
static boolean backTracking(int x, int y) {
// 현재 위치에서 올 수 있는 숫자들
boolean[] isPossible = new boolean[10];
Arrays.fill(isPossible, true);
for (int i = x; i < 9; i++) {
for (int j = i == x ? y : 0; j < 9; j++) {
if(sudoku[i][j] == 0) { // 아직 채우지 않은 수를 발견했다면
// 현재 위치에 올 수 있는 숫자들 구하기
for (int k = 0; k < 9; k++) {
// 가로줄 확인
isPossible[sudoku[i][k]] = false;
// 세로줄 확인
isPossible[sudoku[k][j]] = false;
// 3x3 칸 확인
isPossible[sudoku[i / 3 * 3 + k / 3][j / 3 * 3 + k % 3]] = false;
}
for (int k = 1; k <= 9; k++) {
if(isPossible[k]) { // 가능한 수를 발견했다면
sudoku[i][j] = k;
if(backTracking(i, j)) { // 다음 자리까지 모두 완료되면
return true;
}
}
}
// 채울 수 있는 수를 발견하지 못한 경우, 뒤로 되돌아감
sudoku[i][j] = 0;
return false;
}
}
}
return true;
}
}
728x90
'Problem Solving > BOJ' 카테고리의 다른 글
[백준, BOJ 11780] 플로이드 2 (java) (0) | 2025.06.17 |
---|---|
[백준, BOJ 2213] 트리의 독립집합 (java) (0) | 2025.06.06 |
[백준, BOJ 2982] 국왕의 방문 (java) (0) | 2025.05.30 |
[백준, BOJ 2073] 수도배관공사 (java) (0) | 2025.05.29 |
[백준, BOJ 17485] 진우의 달 여행 (Large) (java) (0) | 2025.05.28 |