[백준] 7682: 틱택토 - JAVA
https://www.acmicpc.net/problem/7682
풀이
구현 문제였다. 틱택토 게임의 게임판을 보고 이 상태로 종료될 수 있는지 보는 문제.
여러 경우를 처리해야 하는 문제였다.
이차원 배열에 입력받으면서 X와 O의 개수를 세줬다. O가 X보다 많으면 invalid.
X의 개수 - O의 개수가 1이나 0이면 3칸을 잇는데 성공한 개수를 센다.
판이 꽉 차있는 경우 O가 이긴다면 invalid. X가 마지막에 놓기 때문이다.
꽉 차있지 않다면 3칸을 잇는데 성공한 개수가 1보다 많으면 invalid.
O가 마지막에 놨는데 O가 이기면, X가 마지막에 놨는데 X가 이기면 invalid.
이외의 경우 valid.
메모리: 15048KB
시간: 144ms
언어: Java 11
코드
import java.io.*;
import java.util.*;
public class Main {
static char[][] board;
static int playerX, playerO, winX, winO;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
String input = "";
while (!(input = br.readLine()).equals("end")) {
board = new char[3][3];
playerX = 0;
playerO = 0;
winX = 0;
winO = 0;
makeBoard(input);
if (playerO > playerX) {
sb.append("invalid").append("\n");
} else if (playerX - playerO == 1 || playerX - playerO == 0) {
checkBoard();
if (playerX + playerO == 9) {
if (winO > 0) {
sb.append("invalid").append("\n");
} else {
sb.append("valid").append("\n");
}
} else {
if (winX + winO != 1) {
sb.append("invalid").append("\n");
} else {
if (playerX - playerO == 1 && winO == 1) {
sb.append("invalid").append("\n");
} else if (playerX - playerO == 0 && winX == 1) {
sb.append("invalid").append("\n");
} else {
sb.append("valid").append("\n");
}
}
}
} else {
sb.append("invalid").append("\n");
}
}
System.out.println(sb);
}
private static void checkBoard() {
for (int i = 0; i < 3; i++) {
String row = "";
String col = "";
for (int j = 0; j < 3; j++) {
row += board[i][j];
col += board[j][i];
}
if (row.equals("XXX")) {
winX++;
}
if (col.equals("XXX")) {
winX++;
}
if (row.equals("OOO")) {
winO++;
}
if (col.equals("OOO")) {
winO++;
}
}
String x = "";
String y = "";
for (int i = 0; i < 3; i++) {
x += board[i][i];
y += board[i][2 - i];
}
if (x.equals("XXX")) {
winX++;
}
if (y.equals("XXX")) {
winX++;
}
if (x.equals("OOO")) {
winO++;
}
if (y.equals("OOO")) {
winO++;
}
}
private static void makeBoard(String input) {
for (int i = 0; i < input.length(); i++) {
char c = input.charAt(i);
if (c == 'X') {
playerX++;
} else if (c == 'O') {
playerO++;
}
board[i / 3][i % 3] = c;
}
}
}