Skip to content

Commit cfad11b

Browse files
committed
issue #42 2580 스도쿠
1 parent 3b98755 commit cfad11b

2 files changed

Lines changed: 116 additions & 0 deletions

File tree

src/backjoon/_2580.java

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
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+
*/

src/backjoon/_9663.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ public class _9663 {
1212
public static int count = 0;
1313

1414
public static void main(String[] args) throws IOException {
15+
// memory 12052 runtime 5728
1516
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
1617
N = Integer.parseInt(br.readLine());
1718
arr = new int[N];

0 commit comments

Comments
 (0)