본문 바로가기
Problem Solving/백준

백준 2239 : 스도쿠

by Libi 2021. 7. 1.
반응형

https://www.acmicpc.net/problem/2239

 

2239번: 스도쿠

스도쿠는 매우 간단한 숫자 퍼즐이다. 9×9 크기의 보드가 있을 때, 각 행과 각 열, 그리고 9개의 3×3 크기의 보드에 1부터 9까지의 숫자가 중복 없이 나타나도록 보드를 채우면 된다. 예를 들어 다

www.acmicpc.net

[ 문제풀이 ]

전형적인 백트래킹을 활용한 완전 탐색 문제이다. 모든 보드를 차례대로 탐색하여 1~9까지의 수를 채워나가면서 스도쿠 퍼즐이 완성될 수 있는지를 확인해주면 된다. 

 

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class Main {

	static int[][] map;
	static boolean end;
	
	public static void main(String[] args) throws IOException {
		try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
				BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out))){
			map = new int[9][9];
			for (int i = 0; i < 9; ++i) {
				String input = br.readLine();
				for (int j = 0; j < 9; ++j) {
					map[i][j] = input.charAt(j) - '0';
				}
			}
			
			dfs(0);
			
			for (int i = 0; i < 9; ++i) {
				for (int j = 0; j < 9; ++j) {
					bw.write(map[i][j]+"");
				}bw.write("\n");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public static void dfs(int depth) {
		if (depth == 81) {
			end = true;
			return;
		}
		
		int y = depth / 9;
		int x = depth % 9;
		
		if (map[y][x] != 0) {
			dfs(depth + 1);
		} else {
			for (int i = 1; i <= 9; ++i) {
				if (!isVaild(y, x, i)) continue;
				map[y][x] = i;
				dfs(depth + 1);
				if (end) return;
				map[y][x] = 0;
			}
		}
	}
	
	public static boolean isVaild(int y, int x, int n) {
		for (int i = 0; i < 9; ++i) {
			if (map[y][i] == n || map[i][x] == n) return false;
		}
		
		int yy = y / 3 * 3;
		int xx = x / 3 * 3;
		for (int i = yy; i < yy + 3; ++i) {
			for (int j = xx; j < xx + 3; ++j) {
				if (map[i][j] == n) return false;
			}
		}
		return true;
	}
}
반응형

'Problem Solving > 백준' 카테고리의 다른 글

백준 2211 : 네트워크 복구  (0) 2021.07.05
백준 1525 : 퍼즐  (0) 2021.07.04
백준 16437 : 양 구출 작전  (0) 2021.07.03
백준 5719 : 거의 최단 경로  (0) 2021.06.30
백준 1593 : 문자 해독  (0) 2021.06.29

댓글