문제 링크 ▶︎ 틱택토
문제에는 많은 조건이 있는데 이런 조건들을 잘 검사하는 것이 중요해보인다.
우선 X를 O보다 먼저 놓기 때문에 격자에 O가 더 많은 경우는 있으면 안되고, 또한 한줄 완성에 따라서 경기가 끝나는데 만약 한줄 완성이 되지 않더라도 빈칸 없이 무승부로 경기가 끝나도 valid한 결과로 출력해야 하는 등, 경우의 수를 모두 파악해서 구현해야한다.
각 줄에 격자를 char[][] 에 받아서 하나씩 검사할 수 있게 입력받는다.
테스트 메서드에는 우선 O,X,빈칸의 갯수를 구해놓고, O의 수 == X의 수가 아니거나 O의 수+1 == X의 수가 아닌 경우는 바로 false를 리턴해 invalid한 경우임을 캐치한다.
격자의 가로 세로 대각선이 같은 문자로 이루어져있는지 검사하고 나서는 조건을 통해서 true, false를 리턴한다.
첫번째로는 X가 승리를 거두고 valid하게 끝나는 경우인데, 이때는 무조건 X의 갯수가 많아야하고 X가 한줄완성을 해야한다. 그리고 O의 한줄완성은 없어야한다.
두번째로는 O가 승리를 거두고 valid하게 끝나는 경우인데, 이때는 O가 후공이므로 X와 갯수가 같아야하고 X는 한줄완성이 없어야하고 O는 한줄완성을 해야한다.
마지막으로는 무승부로 valid하게 끝나는 경우인데, 이때는 빈칸이 없어야하고 9칸이 다 차야하므로 X와 O 모두 한줄완성이 없어야한다.
이 경우를 제외하고는 모두 invalid한 경우라고 생각할 수 있다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
List<char[][]> data = new ArrayList<>();
while (true) {
String line = br.readLine();
if (line.equals("end")) {
break;
}
char[][] tic = new char[3][3];
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
tic[i][j] = line.charAt(3*i+j);
}
}
data.add(tic);
}
for (int i = 0; i < data.size(); i++) {
if (test(data.get(i))) {
System.out.println("valid");
} else {
System.out.println("invalid");
}
}
}
public static boolean test(char[][] tic) {
int x = 0, o = 0, n = 0;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (tic[i][j] == 'O') {
o++;
} else if (tic[i][j] == 'X') {
x++;
} else {
n++;
}
}
}
if (x != o && x != (o + 1)) {
return false;
}
int x_total_cnt = 0;
int o_total_cnt = 0;
for (int i = 0; i < 3; i++) {
if (tic[i][0] == 'O' && tic[i][1] == 'O' && tic[i][2] == 'O') {
o_total_cnt++;
}
if (tic[i][0] == 'X' && tic[i][1] == 'X' && tic[i][2] == 'X') {
x_total_cnt++;
}
if (tic[0][i] == 'O' && tic[1][i] == 'O' && tic[2][i] == 'O') {
o_total_cnt++;
}
if (tic[0][i] == 'X' && tic[1][i] == 'X' && tic[2][i] == 'X') {
x_total_cnt++;
}
}
if (tic[0][0] == 'O' && tic[1][1] == 'O' && tic[2][2] == 'O') {
o_total_cnt++;
}
if (tic[0][0] == 'X' && tic[1][1] == 'X' && tic[2][2] == 'X') {
x_total_cnt++;
}
if (tic[0][2] == 'O' && tic[1][1] == 'O' && tic[2][0] == 'O') {
o_total_cnt++;
}
if (tic[0][2] == 'X' && tic[1][1] == 'X' && tic[2][0] == 'X') {
x_total_cnt++;
}
if (x > o && x_total_cnt > 0 && o_total_cnt == 0) {
return true;
}
if (x == o && x_total_cnt == 0 && o_total_cnt > 0) {
return true;
}
if (n == 0 && x_total_cnt == 0 && o_total_cnt == 0) {
return true;
}
return false;
}
}