[백준] 7682: 틱택토 - JAVA

https://www.acmicpc.net/problem/7682

풀이

구현 문제였다. 틱택토 게임의 게임판을 보고 이 상태로 종료될 수 있는지 보는 문제.

여러 경우를 처리해야 하는 문제였다.

  1. 이차원 배열에 입력받으면서 X와 O의 개수를 세줬다. O가 X보다 많으면 invalid.

  2. X의 개수 - O의 개수가 1이나 0이면 3칸을 잇는데 성공한 개수를 센다.

  3. 판이 꽉 차있는 경우 O가 이긴다면 invalid. X가 마지막에 놓기 때문이다.

  4. 꽉 차있지 않다면 3칸을 잇는데 성공한 개수가 1보다 많으면 invalid.

  5. O가 마지막에 놨는데 O가 이기면, X가 마지막에 놨는데 X가 이기면 invalid.

  6. 이외의 경우 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;
        }
    }

}