Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 객체 지향
- 버퍼비우기
- 생성자
- nextInt
- 인터페이스
- 17472
- python
- 열거형
- Encapsulation
- abstract
- 상속
- 객체지향
- 다형성
- Scanner
- 와일드카드
- Final
- 프림알고리즘
- 제네릭
- 최소신장트리
- 추상화
- java
- 추상 클래스
- this
- inheritance
- enum
- 캡슐화
- 내부 클래스
- polymorphism
- 백준
Archives
- Today
- Total
쫑쫑이의 블로그
백준 2239 스도쿠 Java [백트래킹, DFS] 본문
https://www.acmicpc.net/problem/2239
각 행과 열, 3x3 사각형의 방문 배열을 만들어 1 ~ 9 까지 중복없이 스도쿠 퍼즐을 채운다
3x3 사각형의 방문 배열의 경우 왼쪽 위에서부터 순서대로 배정했고,
행을 3으로 나눈 몫에 3을 곱하고, 열을 3으로 나눈 몫을 더해주면 해당 인덱스에 접근할 수 있다
사전식에서 가장 앞서는 경우를 출력해야하기 때문에 각 자리를 1부터 9까지 가능한 경우의 수를 구하고
끝까지 구해질 경우 탈출조건을 줘서 탐색을 멈추게 했다
import java.io.*;
import java.util.*;
public class Main {
static int[][] puzzle;
static boolean[][] row_vtd, col_vtd, squ_vtd;
static boolean isFind;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
puzzle = new int[9][9];
row_vtd = new boolean[9][10];
col_vtd = new boolean[9][10];
squ_vtd = new boolean[9][10];
isFind = false;
for (int i = 0; i < 9; i++) {
puzzle[i] = Arrays.stream(br.readLine().split("")).mapToInt(Integer::parseInt).toArray();
}
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
if (puzzle[i][j] != 0) {
setVtd(i, j, puzzle[i][j], true);
}
}
}
dfs(0, 0);
for (int[] p : puzzle) {
Arrays.stream(p).forEach(sb::append);
sb.append("\n");
}
sb.setLength(sb.length() - 1);
System.out.println(sb);
}
static void dfs(int r, int c) {
if (r == 8 && c == 9) {
isFind = true;
return;
}
if (c == 9) {
r++;
c %= 9;
}
if (puzzle[r][c] != 0) dfs(r, c + 1);
else {
for (int n = 1; n < 10; n++) {
if (!isVtd(r, c, n)) {
setVtd(r, c, n,true);
dfs(r, c + 1);
if (isFind) {break;}
setVtd(r, c, n, false);
};
}
}
}
static void setVtd(int r, int c, int n, boolean tf) {
row_vtd[r][n] = tf;
col_vtd[c][n] = tf;
squ_vtd[(r/3)*3 + c/3][n] = tf;
puzzle[r][c] = tf ? n : 0;
}
static boolean isVtd(int r, int c, int n) {
return row_vtd[r][n] || col_vtd[c][n] || squ_vtd[(r/3)*3 + c/3][n];
}
}
어디가 틀린지 모르고 dfs 메서드를 전체 디버깅하니까 틀린 지점 찾는데 너무 오래걸렸다
디버깅 포인트를 설정할 때 어디에 설정할지 좀 더 생각해봐야겠다
'알고리즘 > 백준' 카테고리의 다른 글
백준 9328 열쇠 Java [구현, BFS] (0) | 2022.11.15 |
---|---|
백준 2252 줄 세우기 Java [위상정렬] (0) | 2022.11.14 |
백준 1987 알파벳 Java [DFS] (0) | 2022.11.12 |
백준 2568 전깃줄 - 2 Java [LIS] (0) | 2022.11.11 |
백준 4386 별자리 만들기 Java [최소스패닝트리, 프림] (0) | 2022.11.10 |