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 | 31 |
Tags
- Spring
- 자바
- 백준
- Java
- 다시보기
- 기본유형
- DP
- 다익스트라
- 코테
- 알고리즘기본개념
- 코드트리
- SSAFY
- database
- 알고리즘
- 싸피
- 유니온파인드
- 트러블슈팅
- 부분수열의합2
- 그래프
- JUnit
- DFS
- SWEA
- 완탐
- JPA
- 코딩테스트
- Union Find
- 그리디
- BFS
- 완전탐색
- 코딩테스트실력진단
Archives
- Today
- Total
HwangHub
[Java/백트래킹] 백준 2239. 스도쿠 본문
🤔 Intuition
* @intuition 사전순 출력이라는 말에서 완탐 느낌이 났지만, 시간초과가 날까 고민했다.
근데 시간 복잡도 계산해보니 충분할 것 같아서 백트래킹으로 구현했다.
🔎 Algorithm & Complexity
* @algorithm backtracking
* @time O(9 * N^2) 최대 N^2개의 빈칸에 대하여 9개씩의 경우를 배치 -> 368 ms
* @memory O(N^2) N^2의 맵 운영 -> 16388 KB
👨🏻💻 Logic
public class BOJ_2239_스도쿠 {
private static int[] rowFlag = new int[10]; // 1 ~ 9번째 row에 대하여 고른 숫자 선택
private static int[] colFlag = new int[10]; // 1 ~ 9번째 col에 대하여 고른 숫자 선택
private static int[][] secFlag = new int[4][4]; // 3 x 3 섹션에 대하여 고른 숫자 선택
private static int[][] map = new int[10][10];
private static List<int[]> zeros = new ArrayList<>();
static StringBuilder sb = new StringBuilder();
private static boolean hasAnswer = false;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
for (int i = 1; i <= 9; i++) {
String s = br.readLine();
for (int j = 1; j <= 9; j++) {
int num = Integer.parseInt(s.substring(j- 1, j));
rowFlag[i] |= 1 << num;
colFlag[j] |= 1 << num;
secFlag[((i - 1) / 3) + 1][((j - 1) / 3) + 1] |= 1 << num;
map[i][j] = num;
if (num == 0) {
zeros.add(new int[]{i, j});
}
}
}
go(0);
br.close();
bw.write(sb.toString());
bw.flush();
bw.close();
}
private static void go(int depth) {
if (hasAnswer) {
return;
}
if (depth == (zeros.size())) {
// 정답에 일치하는 경우
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= 9; j++) {
sb.append(map[i][j]);
}
sb.append("\n");
}
hasAnswer = true;
return;
}
int[] z = zeros.get(depth);
int y = z[0];
int x = z[1];
for (int j = 1; j <= 9; j++) {
if (((rowFlag[y] & 1 << j) == 0) && ((colFlag[x] & 1 << j) == 0) && ((secFlag[((y - 1) / 3) + 1][((x - 1) / 3) + 1] & 1 << j) == 0)) {
map[y][x] = j;
rowFlag[y] |= 1 << j;
colFlag[x] |= 1 << j;
secFlag[((y - 1) / 3) + 1][((x - 1) / 3) + 1] |= 1 << j;
go(depth + 1);
map[y][x] = 0;
rowFlag[y] &= ~(1 << j);
colFlag[x] &= ~(1 << j);
secFlag[((y - 1) / 3) + 1][((x - 1) / 3) + 1] &= ~(1 << j);
}
}
}
}
'workspace > 알고리즘' 카테고리의 다른 글
[Java/스택] 백준 5397. 키로거 (0) | 2024.03.28 |
---|---|
[Java/투포인터, 누적합] 코드트리. 바구니 안의 사탕 (0) | 2024.03.28 |
[Java/투포인터] 백준 2482. 색상환 (1) | 2024.03.27 |
[Java/투포인터] 코드트리. 겹치는 숫자가 없는 최대 구간 (0) | 2024.03.27 |
[Java/Topological Sort] 백준 2252. 줄세우기 (0) | 2024.03.22 |
Comments