21.09.08 기록

1 분 소요

백준 알고리즘 2580 풀이

🎆해설(메모리 27.5MB, 시간 504ms로 통과)

-백트래킹을 어떻게 써야하는지 감도 잡지 못해 해설을 봤다.(재귀 함수를 구현하는 것부터가 문제인 것 같다..😥)

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

public class B2580 {
    public static int size = 9;
    public static int[][] sudoku = new int[size][size];

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        StringTokenizer st;
        for(int i = 0 ; i < size; i++) {
            st = new StringTokenizer(br.readLine(), " ");
            for(int j = 0; j < size; j++) {
                sudoku[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        getSudoku(0,0);
    }

    public static void getSudoku(int row, int col) {

        //행이 다 채워진 경우 다음 열로
        if(col == size) {
            getSudoku(row + 1, 0);
            return;
        }

        //열도 모두 채워진 경우 출력 후 종료
        if(row == size) {
            StringBuilder sb = new StringBuilder();
            for(int i = 0; i < size; i++) {
                for(int j = 0; j < size; j++) {
                    sb.append(sudoku[i][j]).append(' ');
                }
                sb.append('\n');
            }
            System.out.println(sb);
            System.exit(0);
        }

        //값이 0일 때 가능한 수 탐색
        if(sudoku[row][col] == 0) {
            for(int i = 1; i <= size; i++) {
                if(isPossible(row, col, i)) {//sudock[row][col] = i 가 가능한지? (중복 검사)
                    sudoku[row][col] = i;
                    getSudoku(row, col+1);
                }
            }
            sudoku[row][col] = 0;
            return;
        }

        getSudoku(row, col + 1);
    }

    public static boolean isPossible(int row, int col, int val) {
        //같은 행에 있는 원소들 중 겹치는 열 원소가 있는지 검사
        for(int i = 0; i < size; i++) {
            if(sudoku[row][i] == val) {
                return false;
            }
        }

        //같은 열에 있는 원소들 중 겹치는 행 원소가 있는지 검사
        for(int i = 0; i < size; i++) {
            if(sudoku[i][col] == val) {
                return false;
            }
        }

        //3*3 칸에 중복되는 원소가 있는지 검사
        int setRow = (row / 3) * 3;
        int setCol = (col / 3) * 3;

        for(int i = setRow; i < setRow+3; i++) {
            for(int j = setCol; j < setCol+3; j++) {
                if(sudoku[i][j] == val) {
                    return false;
                }
            }
        }
        return true;
    }
}


카테고리:

업데이트: