
틱택토의 상태를 검증하는 문제이다.
일단 틱택토에서 실수가 있는경우는 다음과 같다.
1. O의 숫자-X의 숫자가 0이거나 1이 아닐때 (O가 선공)
2. X가 완성했는데 O도 완성하는경우 또는 그 반대.
3. X가 완성된 상태에서 X의 숫자+1이 O의 숫자와 같지않을 때
4. O가 완성된 상태에서 X의 숫자가 O의 숫자와 같지않을 때
이를 통해서 구현할수만 있다면 해결 가능한 문제이다.
코드
class Solution {
public int solution(String[] board) {
String[][] boardBox= new String[3][3];
int[] win =new int[2];
int Xcount=0,Ocount=0;
for(int i=0;i<3;i++){
String boardRow = board[i];
for(int j=0;j<3;j++){
boardBox[i][j] = Character.toString(boardRow.charAt(j));
if(boardBox[i][j].equals("X")){
Xcount++;
}else if(boardBox[i][j].equals("O")){
Ocount++;
}
}
}
boardCheckWin(boardBox,win);
// System.out.println(win[0] + ""+win[1]);
if(!(Ocount-Xcount==0||Ocount-Xcount==1)) return 0;
if(win[0]>0&&win[1]>0) return 0;
if(win[0]>0&&Xcount!=Ocount) return 0;
if(win[1]>0&&(Xcount+1)!=Ocount) return 0;
int answer = 1;
return answer;
}
void boardCheckWin(String[][] board,int[] win){
for(int i=0;i<3;i++){
if(board[i][0].equals(board[i][1])&&board[i][1].equals(board[i][2])){
if(board[i][0].equals("X")){
win[0]+=1;
}else if(board[i][0].equals("O")){
win[1]+=1;
}
}
if(board[0][i].equals(board[1][i])&&board[1][i].equals(board[2][i])){
if(board[0][i].equals("X")){
win[0]+=1;
}else if(board[0][i].equals("O")){
win[1]+=1;
}
}
}
if(board[0][0].equals(board[1][1])&&board[1][1].equals(board[2][2])){
if(board[0][0].equals("X")){
win[0]+=1;
}else if(board[0][0].equals("O")){
win[1]+=1;
}
}
if(board[0][2].equals(board[1][1])&&board[1][1].equals(board[2][0])){
if(board[0][2].equals("X")){
win[0]+=1;
}else if(board[0][2].equals("O")){
win[1]+=1;
}
}
}
}
마지막에 구현과정에서 테스트케이스가 맞지않는 경우가 생겼다. 뭐가 문제인지 몰라서 한참 찾아본 결과 문자 일치를 ==를 통해서 해놓은 부분이 있어서 오류가 났던것. 다음부터는 조심해야겠다.
또한 자바는 call by value인걸 잠시 잊고있었다. 더 숙고하는 버릇을 들여야겠다.