반응형

https://leetcode.com/problems/sudoku-solver/

 

Sudoku Solver - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

 

각 행, 열, 3*3 박스 마다 이미 숫자가 사용된 상태를 기억해주었습니다.

이를 이용하면, 각 칸에 해당 숫자가 입력될 수 있는지 즉시 확인할 수 있습니다.

먼저 초기에 숫자가 사용된 상태를 구해주고, 각 칸을 채워나가며 상태를 업데이트 해줍니다. 

모든 칸을 채울 수 있었으면, 재귀를 빠져나오게 됩니다.

 

스도쿠에 나타난 9개의 3*3 박스는, 좌측 상단부터 우측 하단으로 향하며 0~8의 번호를 붙여주었습니다.

class Solution {
public:
    bool vRow[9][10], vCol[9][10], vBox[9][10];
    
    void solveSudoku(vector<vector<char>>& board) {
        init(board);
        solve(board, 0, 0);
    }
    
    void init(vector<vector<char>>& board) {
        for(int i=0; i<9; i++) {
            for(int j=0; j<9; j++) {
                if(board[i][j] == '.') continue;
                int val = board[i][j] - '0';
                int bn = getBoxNumber(i, j);
                vRow[i][val] = vCol[j][val] = vBox[bn][val] = true;  
            }
        }
    }
    
    bool solve(vector<vector<char>>& board, int x, int y) {
        if(x == 9) return true;
        
        int ny = y == 8 ? 0 : y + 1;
        int nx = x + (ny == 0);
        
        if(board[x][y] != '.') return solve(board, nx, ny);

        for(int i=1; i<10; i++) {
            int bn = getBoxNumber(x, y);
            if(vRow[x][i] || vCol[y][i] || vBox[bn][i]) continue;
            board[x][y] = i + '0';
            vRow[x][i] = vCol[y][i] = vBox[bn][i] = true;
            if(solve(board, nx, ny)) return true;
            vRow[x][i] = vCol[y][i] = vBox[bn][i] = false;
            board[x][y] = '.';
        }
        return false;
    }
    
    int getBoxNumber(int x, int y) {
        return (x / 3 * 3) + y / 3;
    }
};
반응형

'Algorithm' 카테고리의 다른 글

LeetCode 289 : Game of Life  (0) 2022.04.12
LeetCode 682 : Baseball Game  (0) 2022.04.10
LeetCode 36 : Valid Sudoku  (0) 2022.04.09
LeetCode 347 : Top K Frequent Elements  (0) 2022.04.09
LeetCode 703 : Kth Largest Element in a Stream  (0) 2022.04.08

+ Recent posts