Valid Sudoku
생각할 포인트
- 중복확인을 위해 Set을 사용한다
- 중복을 만날 경우 바로 false를 return한다
접근방식
- 행, 열, 정사각형에 대해 각각 for문을 돌린다
- 값을 Set에 넣으며 중복을 비교한다
오답노트
- ”.”에 대한 중복처리를 하지 않아서 중복이 아닌 경우도 중복처리 되었다
전체코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
class Solution {
public boolean isValidSudoku(char[][] board) {
//행
Set s = new HashSet();
for(int i=0; i<9; i++){
for(int j=0; j<9; j++){
char v = board[i][j];
if(v=='.') continue;
if(!s.contains(v))
s.add(v);
else return false;
}
s.clear();
}
//열
for(int i=0; i<9; i++){
for(int j=0; j<9; j++){
char v = board[j][i];
if(v=='.') continue;
if(!s.contains(v))
s.add(v);
else return false;
}
s.clear();
}
//정사각형
//00 03 06
//30 33 36
//60 63 66
for(int r=0; r<9; r+=3){
for(int c=0; c<9; c+=3){
for(int i=r; i<r+3; i++){
for(int j=c; j<c+3; j++){
char v = board[i][j];
if(v=='.') continue;
if(!s.contains(v))
s.add(v);
else return false;
}
}
s.clear();
}
}
return true;
}
}
Best Solution과의 비교
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public boolean isValidSudoku(char[][] board) {
Set seen = new HashSet();
for (int i=0; i<9; ++i) {
for (int j=0; j<9; ++j) {
char number = board[i][j];
if (number != '.')
if (!seen.add(number + " in row " + i) ||
!seen.add(number + " in column " + j) ||
!seen.add(number + " in block " + i/3 + "-" + j/3))
return false;
}
}
return true;
}
- Runtime은 내 것이 3ms, Best Soultion이 13ms로 Best Solution이 더 오래걸리지만 코드가 압도적으로 간소화되었다
- 이중 for문을 돌리며 String Set을 이용해 중복체크를 하고 있다.
- 나는 contains로 이미 수가 존재하는지 확인했는데, add()의 반환값으로 오는 boolean으로 if문을 확인하고 있다. 이를 통해 코드를 조금 더 간소화시킬 수 있을 것 같다
This post is licensed under CC BY 4.0 by the author.
