오늘 소개하는 자바 소스는 스도쿠 게임 정답을 알아내는 스도쿠 정답 로직 입니다.

소스는 설명할건 없고 쭉~ 보시면 다 아실거라 생각되요

value 값에 스도쿠 게임 문제를 입력해주시면 정답이 출력 됩니다.

문제는 0099700720200 이런식으로 입력해주시면 되고 0자리는 빈칸입니다.

이해가 안되시는 부분은 댓글 남겨주시면 답변드리겠습니다 ^^


public class SudokuSolver extends Exception{
    
    public SudokuSolver(String value ) {
      
        
        int[][] sudoku = new int[9][9];
        String line = value;
        int ii = 0;
        for (int y = 0; y < 9; y++){
            ii += 9;
            int xx = 0;
            for (int x = ii - 9; x < ii; x++){
                sudoku[y][xx] = Character.getNumericValue(line.charAt(x));   
                xx++;
            }
        }

        solve(sudoku, 0, 0);
    }
    
    private void solve(int[][] sudoku, int cellX, int cellY){         
        if(cellY > 8){
            printSudoku(sudoku);
        }else{
            int nextX = cellX;
            int nextY = cellY;
            if(cellX == 8){
                nextX = 0;
                nextY++;
            }else{
                nextX++;
            }

            if(sudoku[cellY][cellX] != 0){
                solve(sudoku, nextX, nextY);
            }else{
                for(int checkNum = 1; checkNum < 10; checkNum++){
                    if(checkSquare(sudoku, cellX, cellY, checkNum)
                            && checkRow(sudoku, cellY, checkNum)
                            && checkCol(sudoku, cellX, checkNum))
                    {
                        sudoku[cellY][cellX] = checkNum;
                        solve(sudoku, nextX, nextY);
                    }
                }
                sudoku[cellY][cellX] = 0;
            }
        }
    }

    private boolean checkSquare(int[][] sudoku, int reqX, int reqY, int toCheck)    {
        int rowY;
        int colX;

        if(reqX < 3){
            colX = 0;
        }else if (reqX < 6){
            colX = 3;
        }else{
            colX = 6;
        }

        if(reqY < 3){
            rowY = 0;
        }else if (reqY < 6){
            rowY = 3;
        }else{
            rowY = 6;
        }

        for(int y = rowY; y < rowY + 3; y++){
            for(int x = colX; x < colX + 3; x++){
                if(sudoku[y][x] == toCheck){
                    return false;
                }
            }
        }

        return true;
    }

    private boolean checkRow(int[][] sudoku, int rowY, int toCheck){
        for(int x = 0; x < 9; x++){
            if (toCheck == sudoku[rowY][x]){
                return false;
            }
        }
        return true;
    }

    private boolean checkCol(int[][] sudoku, int colX, int toCheck){
        for(int y = 0; y < 9; y++){
            if (toCheck == sudoku[y][colX]){
                return false;
            }
        }
        return true;
    }

    private void printSudoku(int sudoku[][]){

        for(int y = 0; y < 9; y++){
            for(int x = 0; x < 9; x++){
                System.out.print(sudoku[y][x]);
                if(x == 8){
                System.out.println();
                }
            }
        }
      
    }
}


+ Recent posts