본문 바로가기

OJ

[BOJ] 2580 스도쿠 (JAVA)

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

 

2580번: 스도쿠

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

www.acmicpc.net

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
	
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static StringBuilder sb = new StringBuilder();
    static StringTokenizer st;
    static int[][] arr;
    static boolean flag;

    public static void main(String[] args) throws Exception {

        arr = new int[9][9];
        for (int i = 0; i < 9; i++) {
            st = new StringTokenizer(br.readLine(), " ");
            for (int j = 0; j < 9; j++) {
                arr[i][j] = Integer.parseInt(st.nextToken());
            }
        } // end of input

        fill(0);

        System.out.print(sb);

    }

    static void fill(int index) {

        int i = index / 9;
        int j = index % 9;

        while (i < 9) {
            if (arr[i][j] == 0) {
                for (int num = 1; num <= 9; num++) {
                    if (check(i, j, num)) {
                        arr[i][j] = num;
                        fill(i * 9 + j + 1);
                        if (flag) return;
                        arr[i][j] = 0;
                    }
                }
                if (arr[i][j] == 0) return;
            }
            if (8 < ++j) {
                j = 0;
                i++;
            }
        }

        for (int r = 0; r < 9; r++) {
            for (int c = 0; c < 9; c++) {
                sb.append(arr[r][c]).append(" ");
            }
            sb.append("\n");
        }
        flag = true;

    }

    static boolean check(int row, int col, int num) {

        for (int i = 0; i < 9; i++) {
            if (arr[i][col] == num) return false;
        }
        for (int j = 0; j < 9; j++) {
            if (arr[row][j] == num) return false;
        }
        for (int i = (row / 3) * 3; i < (row / 3 + 1) * 3; i++) {
            for (int j = (col / 3) * 3; j < (col / 3 + 1) * 3; j++) {
                if (arr[i][j] == num) return false;
            }
        }
        return true;

    }
	
}

'OJ' 카테고리의 다른 글

[BOJ] 2225 합분해 (JAVA)  (2) 2023.03.20
[BOJ] 2293 동전 1 (JAVA)  (0) 2023.03.19
[BOJ] 27519 소수의 합 (JAVA)  (0) 2023.03.17
[BOJ] 27514 1차원 2048 (JAVA)  (0) 2023.03.16
[BOJ] 27512 스네이크 (JAVA)  (0) 2023.03.15