구현은 쉬운데 반례 찾는게 좀 힘들었던..
마지막에 내가 놓쳤던 부분은 오목의 3x3이 되는 수와 같은 모양을 하는 수를 놓쳤었다.
첫번째로 말이 안되는 x가 o보다 많거나, 그렇다고 o가 x랑 2개이상 차이가 난다거나 하는 경우를 거르고
두번째로 둘 다 줄을 완성하는 경우를 거르고
세번째로 누군가 이겼다면, 이기는 시점에서 o와 x의 카운트상 나와서는 안되는 카운트가 있다. 그 부분을 차례차례 예외처리했더니 통과했다.
import java.util.*;
class Solution {
public char[][] map;
public int win(char c) {
int game = 0;
for(int i = 0; i < 3; i++)
{
if(map[i][0] == c && map[i][0] == map[i][1] && map[i][1] == map[i][2])
game++;
if(map[0][i] == c && map[0][i] == map[1][i] && map[1][i] == map[2][i])
game++;
}
if(map[0][0] == c && map[0][0] == map[1][1] && map[1][1] == map[2][2])
game++;
if(map[0][2] == c && map[0][2] == map[1][1] && map[1][1] == map[2][0])
game++;
return game;
}
public int solution(String[] board) {
int answer = 1;
map = new char[3][3];
int oCnt = 0;
int xCnt = 0;
for(int i = 0; i < 3; i++)
{
for(int j = 0; j < 3; j++)
{
map[i][j] = board[i].charAt(j);
if(map[i][j] == 'O')
oCnt++;
if(map[i][j] == 'X')
xCnt++;
}
}
if(xCnt > oCnt || oCnt - xCnt > 1)
return 0;
if(win('O') > 0 && win('X') > 0)
return 0;
if(win('O') > 0) {
if(oCnt == xCnt)//o가 이겼으면 o가 한개 많아야함
return 0;
}
if(win('X') > 0) {
if(oCnt > xCnt)
return 0;
}
return answer;
}
//x가 이기면 수가 같아야하고, o가 이기면 o가 한개 많아야함
}
덕분에 좋은 내용 잘 보고 갑니다.
정말 감사합니다.