문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/160585
이 문제는 문제의 조건을 꼼꼼하게 구현하면 풀 수 있습니다. 이 문제의 가장 어려운 부분은 반례를 찾는 부분입니다. 주의해야 할 부분은 크게 3가지입니다.
다음은 코드입니다.
import java.util.*;
class Solution {
static String[][] map = new String[3][3];
static int oNum=0, xNum=0;
public int solution(String[] board) {
for(int i=0;i<board.length;i++){
for(int j=0;j<board[i].length();j++){
char curr = board[i].charAt(j);
if(curr == 'O') oNum++;
else if(curr == 'X') xNum++;
map[i][j] = String.valueOf(curr);
}
}
int diff = Math.abs(oNum-xNum);
if(diff > 1 || xNum>oNum) return 0;
if (isWin("O") && xNum + 1 != oNum) return 0;
if (isWin("X") && xNum != oNum) return 0;
return 1;
}
static boolean isWin(String piece){
// 가로 방향 체크
for(String[] element : map){
if(element[0].equals(piece) &&
element[1].equals(piece) &&
element[2].equals(piece)
) return true;
}
// 세로 방향 체크
for(int i=0;i<3;i++){
if(map[0][i].equals(piece) &&
map[1][i].equals(piece) &&
map[2][i].equals(piece)
) return true;
}
// 대각선 방향 체크
if(map[0][0].equals(piece) &&
map[1][1].equals(piece) &&
map[2][2].equals(piece)) return true;
if(map[0][2].equals(piece) &&
map[1][1].equals(piece) &&
map[2][0].equals(piece)) return true;
return false;
}
}