코딩테스트 준비/leetcode

36. Valid Sudoku [Medium]

MAKGA 2021. 6. 13. 23:28
320x100

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

 

Valid Sudoku - 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

 

문제를 요약하자면 Input으로 주어진 스도쿠 데이터의 현재까지 상태가 규칙에 맞는지 아닌지를 판별하면 되는 문제.

스도쿠의 규칙은

1. 한 가로줄에 중복되는 숫자가 없을 것

2. 한 세로줄에 중복되는 숫자가 없을 것

3. 겹치지 않는 3x3 칸 안에 중복되는 숫자가 없을 것

3가지다.

 

bool isValidSudoku(vector<vector<char>>& board) {
    // 가로 세로가 동일하다고 가정이니까
    int size = board.size();
    for (int i=0; i<size; ++i)
    {
        for (int j=0; j<size; ++j)
        {
            if (board[i][j] == '.') {
                continue;
            }

            // 가로, 세로
            for (int k = 0; k < size; ++k) {
                if ((i != k && board[i][j] == board[k][j]) ||
                    (j != k && board[i][j] == board[i][k])) {
                    return false;
                }
            }

            // 3x3
            for (int k = i / 3 * 3; k < ((i / 3) + 1) * 3; ++k)
            {
                for (int l = j / 3 * 3; l < ((j / 3) + 1) * 3; ++l)
                {
                    if (i != k && j != l && board[i][j] == board[k][l]) {
                        return false;
                    }
                }
            }
        }
    }
        
    return true;
}

 

그냥 정말 규칙대로 줄줄이 썼는데 생각보다 빨라서 당황했다..

뭔가 좀 더 멋진 코드같은게 있을거 같은데..

왜 상위권이지;;

 

풀고나서 다른 사람의 풀이를 보고 났더니 있었다.

중복되는 숫자가 있으면 안되니까 lookup 테이블을 만들어서 푸는 방법도 있더라... 역시 아는건데도 안떠오른다

 

320x100