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