-
2580 - 스도쿠Baekjoon 2022. 5. 30. 13:59
생각한것들
간단한 백트래킹 문제였다. 백트래킹 체크 부분도 그다지 어렵지 않았는데.. 자그마한 실수 때문에 풀이 시간이 정말 많이 늘어났던 문제다.
실수
백트래킹 체크 부분을 지난 후, 버려야 할 분기임에도 다음 좌표로 넘어가게되어 무한루프에 빠지는 경우가 생겼다.
0인 칸에 1~9까지의 가능한 숫자들을 넣어보고(반복문) 가능한 숫자가 존재하지 않으면 반복문을 종료해야하는데, 2중 반복문인것을 간과하고 한 개의 반복문만 종료시킨게 실수였다.문제 풀이
간단하게, 9*9 map을 돌면서 0인칸이 나오면 숫자가 들어가있지않은 칸이기 때문에, 1~9까지 넣어보며 가능한 값을 찾는다. 가능한 값이 존재하지 않을 경우, 해당 분기를 버린다.
package backjoon; import java.io.*; import java.util.ArrayList; import java.util.StringTokenizer; public class P_2580 { static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); static ArrayList<Integer> check = new ArrayList<>(); static int[][] map = new int[9][9]; public static void find(int N, int count, int sx) throws IOException{ if (count == N) { for (int[] ints : map) { bw.write(Integer.toString(ints[0])); for (int j = 1; j < map[0].length; j++) bw.write(" " + ints[j]); bw.write("\n"); } bw.flush(); System.exit(0); } else { for (int i = sx; i < 9; i++) { boolean quit = false; for (int j = 0; j < 9; j++) { if (map[i][j] == 0) { for (int k = 1; k < 10; k++) { boolean is_poss = true; check.clear(); for (int x = 0; x < 9; x++) check.add(map[x][j]); // 세로 체크 if (check.contains(k)) is_poss = false; if (is_poss) { check.clear(); for (int y = 0; y < 9; y++) check.add(map[i][y]); // 가로 체크 if (check.contains(k)) is_poss = false; } if (is_poss) { // 9칸 체크 check.clear(); int nx = (i / 3) * 3; int ny = (j / 3) * 3; for (int x = nx; x < nx + 3; x++) { for (int y = ny; y < ny + 3; y++) check.add(map[x][y]); } if (check.contains(k)) is_poss = false; } if (is_poss) { map[i][j] = k; find(N, count + 1, i); map[i][j] = 0; } } } if (map[i][j] == 0) { quit = true; break; } } if (quit) break; // 빼먹었던 부분 } } } public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int N = 0; 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()); if (map[i][j] == 0) N++; } } find(N, 0, 0); } } //0 0 0 0 0 0 0 0 9 // 0 0 0 0 0 0 0 0 8 // 0 0 0 0 0 0 0 0 7 // 0 0 0 0 0 0 0 0 6 // 0 0 0 0 0 0 0 0 5 // 0 0 0 0 0 0 0 0 4 // 0 0 0 0 0 0 0 0 3 // 0 0 0 0 0 0 0 0 2 // 0 0 0 0 0 0 0 0 1 //0 0 0 0 0 0 0 0 0 // 7 8 2 1 3 5 6 4 9 // 4 6 9 2 7 8 1 3 5 // 3 2 1 5 4 6 8 9 7 // 0 0 0 0 0 0 0 0 0 // 5 9 6 8 2 7 4 1 3 // 9 1 7 6 5 2 3 8 4 // 6 4 3 7 8 1 9 5 2 // 0 0 0 0 0 0 0 0 0
'Baekjoon' 카테고리의 다른 글
14502 - 연구소 (2) 2022.12.28 1074 - Z (0) 2022.12.07 16197 - 두 동전 (0) 2022.05.28 14888, 15685 - 연산자 끼워넣기 (1), (2) (0) 2022.05.26 20055 - 컨베이어 벨트 위의 로봇 (0) 2022.05.24