본문 바로가기

ALGORITHM

백준 2580, 2239 스도쿠 (Java)

1. 문제 링크

 

2580번: 스도쿠

스도쿠는 18세기 스위스 수학자가 만든 '라틴 사각형'이랑 퍼즐에서 유래한 것으로 현재 많은 인기를 누리고 있다. 이 게임은 아래 그림과 같이 가로, 세로 각각 9개씩 총 81개의 작은 칸으로 이루

www.acmicpc.net

 

2239번: 스도쿠

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

www.acmicpc.net

 

2. 문제 및 입출력예제

 

3. 문제 풀이

두 문제가 입출력의 공백 차이 뿐이라 함께 가져왔다.

dfs 느낌으로 이 숫자일 때 다음 숫자가 가능한지 그 다음은 가능한지... 의 순서로 코드를 진행한다.

 

4. 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;

public class Main {
	static class Point{
		int x;
		int y;
		int num;
		public Point(int x, int y, int num) {
			super();
			this.x = x;
			this.y = y;
			this.num = num;
		}
	}
	static int[][] map;
	static int idx;
	static ArrayList<Point> blank;
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
	
		blank = new ArrayList<>();
		map = new int[9][9];
		for(int i=0;i<9;i++) {
			String[] split = br.readLine().split("");
			for(int j=0;j<9;j++) {
				map[i][j] = Integer.parseInt(split[j]);
				if(map[i][j] == 0) {
					blank.add(new Point(i, j, 0));
				}
			} 
		}
		
		sudoku(0);
		
		for(int i=0;i<9;i++) {
			for(int j=0;j<9;j++) {
				sb.append(map[i][j]+"");
			}
			sb.append("\n");
		}
		System.out.println(sb);
	}
	
	
	private static boolean sudoku(int cnt) {
		if(cnt == blank.size()) {//전부 다 채웠다면
			return true;
		}
		Point p = blank.get(cnt);
		int x = p.x;
		int y = p.y;
		for(int i=1;i<10;i++) {
			if(possible(map, x, y, i)) {
				map[x][y] = i;
				if(sudoku(cnt+1)) return true;
				map[x][y] = 0; //끝까지 못 가면 초기화
			}
		}
		
		return false;
	}


	private static boolean possible(int[][] map, int x, int y, int num) {
		int len = map.length;
		int sero = x/3;
		int garo = y/3;
		
		//가로, 세로
		for(int i=0;i<len;i++) { //이미 있는 숫자라면
			if(map[x][i] == num) return false;
			if(map[i][y] == num) return false;
		}
		
		for(int i=0;i<3;i++) {
			for(int j=0;j<3;j++) {
				if(map[sero*3+i][garo*3+j] == num) {
					return false;
				}
			}
		}
		
		return true;
	}
}