9x9 크기의 스도쿠 판이 유효할 수 있는지 판단하라.
빈칸은 다음과 같은 규칙으로 채워진다.
- 각각 row는 중복 없는 1~9 사이 숫자로 이루어진다.
- 각 col은 중복 없는 1~9 사이 숫자로 이루어진다.
- 3x3의 9개의 서브박스는 중복 없는 1~9 사이 숫자로 이루어진다.
숫자를 채워 넣는 스도쿠가 아니라 그냥 현재 스도쿠의 상태를 판정하는 문제이다. 중복 확인만 잘하면 된다.
중복 확인은 어떻게 해야할까? 열과 행은 각각을 HashSet으로 관리하면 될 것 같다.
박스의 경우 어떻게 해야할까? 박스의 대표 인덱스를 하나 표현할 수 있으면 좋을 것 같다.
이거는 (r / 3) * 3 + (c / 3) 이면 각 박스에 속하는 값들이 모두 같은 결과를 내게 된다. 따라서 해당 결괏값을 id로 사용하겠다.
class Solution {
public boolean isValidSudoku(char[][] board) {
Map<Integer, Set<Character>> rowMap = new HashMap<>();
Map<Integer, Set<Character>> colMap = new HashMap<>();
Map<Integer, Set<Character>> boxMap = new HashMap<>();
for (int i = 0; i < 9; i++) {
rowMap.put(i, new HashSet<>());
colMap.put(i, new HashSet<>());
boxMap.put(i, new HashSet<>());
}
for (int r = 0; r < 9; r++) {
for (int c = 0; c < 9; c++) {
if (board[r][c] != '.') {
char value = board[r][c];
if (rowMap.get(r).contains(value)) return false;
if (colMap.get(c).contains(value)) return false;
int boxId = (r / 3) * 3 + (c / 3);
if (boxMap.get(boxId).contains(value)) return false;
rowMap.get(r).add(value);
colMap.get(c).add(value);
boxMap.get(boxId).add(value);
}
}
}
return true;
}
}
'Algorithm > LeetCode' 카테고리의 다른 글
LeetCode 530 - Minimum Absolute Difference in BST (0) | 2024.10.15 |
---|---|
LeetCode 228 - Summary Ranges (0) | 2024.10.14 |
LeetCode 30 - Substring with Concatenation of All Words (1) | 2024.10.08 |
LeetCode 3 - Longest Substring Without Repeating Characters (0) | 2024.10.07 |
LeetCode 209 - Minimum Size Subarray Sum (0) | 2024.10.04 |