[Java Algorithm] ์ค๋์ฟ BOJ #2239
๋ฌธ์
https://www.acmicpc.net/problem/2239
2239๋ฒ: ์ค๋์ฟ
์ค๋์ฟ ๋ ๋งค์ฐ ๊ฐ๋จํ ์ซ์ ํผ์ฆ์ด๋ค. 9×9 ํฌ๊ธฐ์ ๋ณด๋๊ฐ ์์ ๋, ๊ฐ ํ๊ณผ ๊ฐ ์ด, ๊ทธ๋ฆฌ๊ณ 9๊ฐ์ 3×3 ํฌ๊ธฐ์ ๋ณด๋์ 1๋ถํฐ 9๊น์ง์ ์ซ์๊ฐ ์ค๋ณต ์์ด ๋ํ๋๋๋ก ๋ณด๋๋ฅผ ์ฑ์ฐ๋ฉด ๋๋ค. ์๋ฅผ ๋ค์ด ๋ค
www.acmicpc.net
๋ด ๋ฌธ์ ํ์ด
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
public class Main {
static int[][] map = new int[9][9];
static List<int[]> empty = new ArrayList<>(); // ๋น ์นธ ๋ฆฌ์คํธ
public static void sudoku(int cnt) {
if(cnt == empty.size()) { // ๋น ์นธ ๋ค ์ฑ์ฐ๋ฉด (๊ฒ์ ์ข
๋ฃ ์ฒ๋ฆฌ)
for(int i = 0; i < 9; i++) {
for(int j = 0; j < 9; j++) {
System.out.print(map[i][j]);
}
System.out.println();
}
System.exit(0);
}
// ํ์ฌ ์์น (๋น ์นธ)
int x = empty.get(cnt)[0];
int y = empty.get(cnt)[1];
// ํ์ฌ ์์นํ๋ ์ฌ๊ฐํ์ ์์์
int startX = x / 3 * 3;
int startY = y / 3 * 3;
// x, y ์ง์ ์ ์ํ์ข์ฐ ๋ฐ ์ฌ๊ฐํ ์์ ์๋ ์ซ์๋ค์ ์ฒดํฌ
boolean[] check = new boolean[9];
for(int i = 0; i < 9; i++) {
if(map[x][i] > 0) check[map[x][i]-1] = true; // ์ข์ฐ
if(map[i][y] > 0) check[map[i][y]-1] = true; // ์ํ
}
for(int i = startX; i < startX+3; i++) {
for(int j = startY; j < startY+3; j++) {
if(map[i][j] > 0) check[map[i][j]-1] = true; // ์ฌ๊ฐํ ์
}
}
for(int i = 0; i < 9; i++) {
if(!check[i]) { // ์ฌ์ฉ๋์ง ์์ ์ ๋ฐ๊ฒฌ ์, ํ์ฌ ์์น์ ํด๋นํ๋ ์๋ฅผ ๋ฃ์ด๋ณด๊ณ sudoku ์ฌ๊ท ํธ์ถ (๋ชจ๋ ๊ฒฝ์ฐ์ ์ ๋ฐ์ ธ๋ณด๊ธฐ)
map[x][y] = i+1;
sudoku(cnt+1);
map[x][y] = 0;
}
}
}
public static void main(String[] args) throws Exception {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
for(int i = 0; i < 9; i ++) {
String str = in.readLine();
for(int j = 0; j < 9; j++) {
map[i][j] = str.charAt(j) - '0';
if(map[i][j] == 0) empty.add(new int[]{i, j});
}
}
sudoku(0);
}
}
๐ ๊ตฌํ ๋ฌธ์
์ฃผ์ด์ง ์ ๋ ฅ์ ๋ฐ์ผ๋ฉด์, 0์ด ์ ๋ ฅ๋ ์ empty๋ผ๋ List์ ์ขํ๋ฅผ ์ถ๊ฐํ๊ณ ,
sudoku๋ผ๋ ๋ฉ์๋๋ฅผ ๋ง๋ค์ด์ ๊ฒ์์ ์งํํ๋๋ก ํด์ฃผ์๋ค.
check๋ผ๋ boolean ํ์ ์ ํฌ๊ธฐ 9์ธ ๋ฐฐ์ด์ ๋ง๋ค์ด ์ฃผ๊ณ , 0๋ฒ์งธ ์ธ๋ฑ์ค๋ 1, 1๋ฒ์งธ ์ธ๋ฑ์ค๋ 2, ์ด๋ฐ ์์ผ๋ก
์ซ์์ ์ธ๋ฑ์ค๋ฅผ ๋งคํํ์ฌ 1๋ถํฐ 9๊น์ง์ ์ซ์ ์ค ์ด๋ค ์ซ์๊ฐ ์ฌ์ฉ๋์๊ณ ์ด๋ค ์ซ์๊ฐ ์ฌ์ฉ๋์ง ์์๋์ง๋ฅผ ์ฒดํฌํ๋ค.
empty ๋ฆฌ์คํธ์ ์ฒซ ๋ฒ์งธ ์ขํ๋ถํฐ ์ฐจ๋ก๋๋ก ํ์์ ์งํํด์ฃผ์๋๋ฐ,
x, y์ ํด๋นํ๋ ์ขํ ๊ฐ์ ๋ด๊ณ , ๊ฐ๋จํ ์ฐ์ฐ์ ํตํด x, y์ขํ๊ฐ ์ํ๋ ์ฌ๊ฐํ์ ์์ ์ขํ๋ ๊ตฌํด์ฃผ์๋ค.
(x์ y๊ฐ์ ๊ฐ๊ฐ 3์ผ๋ก ๋๋ ๋ค ๋ค์ 3์ ๊ณฑํด์ฃผ๋ฉด 3*3 ํฌ๊ธฐ์ ์ฌ๊ฐํ์ ์์ ์ขํ๋ฅผ ๊ตฌํ ์ ์๋ค.)
๋ ๊ฐ์ for๋ฌธ์ ์ด์ฉํ์ฌ x, y ์ขํ์ ์, ํ, ์ข, ์ฐ์ ์๋ ์ซ์๋ค ๋ฐ
x, y ์ขํ๊ฐ ์ํ๋ ์ฌ๊ฐํ์ ์๋ ์ซ์๋ค์ ์กฐ์ฌํ์ฌ check์ ํ์ํ๋ค.
๊ทธ๋ฆฌ๊ณ check ๋ฐฐ์ด์ ์ํํ๋ฉฐ ์ฌ์ฉ๋์ง ์์ ์ ๋ฐ๊ฒฌ ์,
๊ทธ ์๋ฅผ ํ์ฌ x, y ์ขํ์ ๋ฃ์ด์ค ๋ค sudoku์ ํ๋ผ๋ฏธํฐ cnt๋ฅผ 1 ์ฆ๊ฐ์์ผ ์ฌ๊ทํธ์ถํ๋ค.
๊ทธ๋ฆฌ๊ณ ๋ค์ x, y ์ขํ์ 0์ ๋ฃ์ด์, ๋ค๋ฅธ ๊ฐ์ ๋ฃ๋ ๊ฒฝ์ฐ๋ ์๊ฐํด์ค ์ ์๋๋ก ํ๋ค.
์์ ๊ฐ์ ๋ฐ๋ณต์ ๊ณ์ํ๋ค๊ฐ ๋น ์นธ์ ๋ชจ๋ ์ฑ์ ๋ค๋ฉด, ์ค๋์ฟ ์ ์ฑ๊ณตํ๋ค๋ ์๋ฏธ์ด๋ฏ๋ก
๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๊ณ ์์คํ ์ ์ข ๋ฃ์์ผฐ๋ค.
+ ๋ฌธ์ ์์ ๋ต์ด ์ฌ๋ฌ ๊ฐ์ผ ๊ฒฝ์ฐ ์ฌ์ ์ ์ผ๋ก ์์๋ ๊ฒ์ ์ถ๋ ฅํ๋ผ๊ณ ํ์๋๋ฐ,
์ด์ฐจํผ ๊ฐ์ฅ ์ข์ธก ์๋จ๋ถํฐ ์์ํ์ฌ ์์ ์๋ถํฐ ์ฑ์๋ฃ๊ธฐ ๋๋ฌธ์
์ด ๋ถ๋ถ์ ๋ฐ๋ก ์ฒดํฌํ์ง ์์๋ ๊ด์ฐฎ๋ค.
๐ก ํผ๋๋ฐฑ
- ์ฒ์์๋ exit ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ง ์๊ณ , return ํ๋ ๊ฒ์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํ๋๋ฐ,
์์ธ์ง ๋ชจ๋ฅด๊ฒ ์ง๋ง ์๊พธ ์ถ๋ ฅ์ด๊ณผ๊ฐ ๋๋๋ผ,,!!
๊ทธ๋์ ๊ตฌ๊ธ๋ง ํด๋ณด๋๊น exit ์ฌ์ฉํด์ผ ํ๋ค๊ณ ํด์ใ ๊ทธ๋ ๊ฒ ๋ฐ๊ฟจ๋๋ ํต๊ณผํ๋ค..
์ฌ์ค ์์ง๋ ์ด์ ๋ฅผ ์ ๋ชจ๋ฅด๊ฒ ์ด์... ๊ณ์ ํ ๋ฒ ์ฐพ์๋ด์ผ๊ฒ ๋ค.