๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
2๏ธโƒฃ Java/Problem Solving

[Java Algorithm] ์Šค๋„์ฟ  BOJ #2239

by seolhee2750 2022. 10. 4.
๋ฌธ์ œ

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 ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๊ณ  ํ•ด์„œใ…œ ๊ทธ๋ ‡๊ฒŒ ๋ฐ”๊ฟจ๋”๋‹ˆ ํ†ต๊ณผํ–ˆ๋‹ค..
    ์‚ฌ์‹ค ์•„์ง๋„ ์ด์œ ๋ฅผ ์ž˜ ๋ชจ๋ฅด๊ฒ ์–ด์„œ... ๊ณ„์† ํ•œ ๋ฒˆ ์ฐพ์•„๋ด์•ผ๊ฒ ๋‹ค.

๋Œ“๊ธ€