[LeetCode] 36. Valid Sudoku

1 minute read

문제 설명

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


풀이

20분
10분 정도 풀이법을 고민하다, 마땅히 효율적인 코드가 생각이 안 나서 냅다 풀었다. 제출한 이후 다른 사람의 코드를 참조하여 다시 풀이했다… 해시맵을 활용한 풀이를 떠올리긴 했지만, 배열의 차원을 높여서 행과 열을 나눠 기록할 생각까지는 닿지 못해서 아쉽다.

코드

// 14:22 ~ 14:43
class Solution {
public:
    bool isValidSudoku(vector<vector<char>>& board) {
        int count[10];

        for(int i = 0; i < 9; ++i){
            memset(count, 0, sizeof(count));
            for(int j = 0; j < 9; ++j){
                if(board[i][j] != '.'){
                    count[board[i][j] - '0'] += 1;
                    if(count[board[i][j] - '0']  > 1) return false;
                }
            }
        }

        for(int j = 0; j < 9; ++j){
            memset(count, 0, sizeof(count));
            for(int i = 0; i < 9; ++i){
                if(board[i][j] != '.'){
                    count[board[i][j] - '0'] += 1;
                    if(count[board[i][j] - '0']  > 1) return false;
                }
            }
        }
        
        for(int i = 0; i < 9; i += 3){
            for(int j = 0; j < 9; j += 3){
                memset(count, 0, sizeof(count));
                for(int di = 0; di < 3; ++di){
                    for(int dj = 0; dj < 3; ++dj){
                        if(board[i + di][j + dj] != '.'){
                            count[board[i + di][j + dj] - '0'] += 1;
                            if(count[board[i + di][j + dj] - '0']  > 1) return false;
                        }
                    }
                }
            }
        }

        return true;
    }
};

다른 코드

class Solution {
public:
    bool isValidSudoku(vector<vector<char>>& board) {
        int row[9][10] = {0,};
        int col[9][10] = {0,};
        int box[3][3][10] = {0,};

        for(int i = 0; i < 9; ++i){
            for(int j = 0; j < 9; ++j){
                if(board[i][j] == '.') continue;
                int n = board[i][j] - '0';
                
                row[i][n] += 1;
                if(row[i][n] > 1) return false;
                
                col[j][n] += 1;
                if(col[j][n] > 1) return false;

                box[i/3][j/3][n] += 1;
                if(box[i/3][j/3][n] > 1) return false;
            }
        }
        return true;
    }
};