1
+ package backjoon ;
2
+ // https://www.acmicpc.net/problem/2580
3
+
4
+ import java .io .BufferedReader ;
5
+ import java .io .IOException ;
6
+ import java .io .InputStreamReader ;
7
+ import java .util .StringTokenizer ;
8
+
9
+ public class _2580 {
10
+
11
+ public static int [][] arr = new int [9 ][9 ]; //스도쿠 판
12
+
13
+ public static void main (String [] args ) throws IOException {
14
+ BufferedReader br = new BufferedReader (new InputStreamReader (System .in ));
15
+ //sol memory 19172 runtime 388
16
+ for (int i = 0 ; i < 9 ; i ++) {
17
+ StringTokenizer st = new StringTokenizer (br .readLine (), " " );
18
+ for (int j = 0 ; j < 9 ; j ++) {
19
+ arr [i ][j ] = Integer .parseInt (st .nextToken ());
20
+ }
21
+ }
22
+
23
+ sudoku (0 , 0 );
24
+ }
25
+
26
+ public static void sudoku (int row , int col ) {
27
+ // 해당 행이 다 채워진 경우 다음행으로 가기
28
+ if (col == 9 ) {
29
+ sudoku (row + 1 , 0 );
30
+ return ;
31
+ }
32
+
33
+ // 행과 열이 다 채워진 경우 스도쿠 판 출력하기
34
+ if (row == 9 ) {
35
+ StringBuilder sb = new StringBuilder ();
36
+ for (int i = 0 ; i < 9 ; i ++) {
37
+ for (int j = 0 ; j < 9 ; j ++) {
38
+ sb .append (arr [i ][j ]).append (" " );
39
+ }
40
+ sb .append ("\n " );
41
+ }
42
+ System .out .println (sb );
43
+ // 스도쿠 판을 채우는 방법이 여럿인 경우는 그 중 하나만을 출력하기 위해서 시스템 종료
44
+ System .exit (0 );
45
+ }
46
+
47
+ // 만약 해당 위치가 0 이라면 1부터 9까지 중 가능한 수 탐색
48
+ if (arr [row ][col ] == 0 ) {
49
+ for (int i = 1 ; i <= 9 ; i ++) {
50
+ // i 값이 중복되지 않는지 검사
51
+ if (possibility (row , col , i )) {
52
+ arr [row ][col ] = i ;
53
+ sudoku (row , col + 1 );
54
+ }
55
+ }
56
+ arr [row ][col ] = 0 ;
57
+ return ;
58
+ }
59
+
60
+ sudoku (row , col + 1 );
61
+
62
+ }
63
+
64
+ public static boolean possibility (int row , int col , int value ) {
65
+ // 같은 행 검사
66
+ for (int i = 0 ; i < 9 ; i ++) {
67
+ if (arr [row ][i ] == value ) {
68
+ return false ;
69
+ }
70
+ }
71
+
72
+ // 같은 열 검사
73
+ for (int i = 0 ; i < 9 ; i ++) {
74
+ if (arr [i ][col ] == value ) {
75
+ return false ;
76
+ }
77
+ }
78
+
79
+ // 3*3 칸 검사
80
+ int set_row = (row / 3 ) * 3 ; // value가 속한 3x3의 행의 첫 위치
81
+ int set_col = (col / 3 ) * 3 ; // value가 속한 3x3의 열의 첫 위치
82
+
83
+ for (int i = set_row ; i < set_row + 3 ; i ++) {
84
+ for (int j = set_col ; j < set_col + 3 ; j ++) {
85
+ if (arr [i ][j ] == value ) {
86
+ return false ;
87
+ }
88
+ }
89
+ }
90
+ return true ; // 중복되는 것이 없을 경우 true 반환
91
+ }
92
+ }
93
+ /*
94
+ INPUT
95
+ 0 3 5 4 6 9 2 7 8
96
+ 7 8 2 1 0 5 6 0 9
97
+ 0 6 0 2 7 8 1 3 5
98
+ 3 2 1 0 4 6 8 9 7
99
+ 8 0 4 9 1 3 5 0 6
100
+ 5 9 6 8 2 0 4 1 3
101
+ 9 1 7 6 5 2 0 8 0
102
+ 6 0 3 7 0 1 9 5 2
103
+ 2 5 8 3 9 4 7 6 0
104
+
105
+ OUTPUT
106
+ 1 3 5 4 6 9 2 7 8
107
+ 7 8 2 1 3 5 6 4 9
108
+ 4 6 9 2 7 8 1 3 5
109
+ 3 2 1 5 4 6 8 9 7
110
+ 8 7 4 9 1 3 5 2 6
111
+ 5 9 6 8 2 7 4 1 3
112
+ 9 1 7 6 5 2 3 8 4
113
+ 6 4 3 7 8 1 9 5 2
114
+ 2 5 8 3 9 4 7 6 1
115
+ */
0 commit comments