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

 

문제

틱택토 게임은 두 명의 사람이 번갈아가며 말을 놓는 게임이다. 게임판은 3×3 격자판이며, 처음에는 비어 있다. 두 사람은 각각 X 또는 O 말을 번갈아가며 놓는데, 반드시 첫 번째 사람이 X를 놓고 두 번째 사람이 O를 놓는다. 어느 때든지 한 사람의 말이 가로, 세로, 대각선 방향으로 3칸을 잇는 데 성공하면 게임은 즉시 끝난다. 게임판이 가득 차도 게임은 끝난다.

게임판의 상태가 주어지면, 그 상태가 틱택토 게임에서 발생할 수 있는 최종 상태인지를 판별하시오.

입력

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 줄은 9개의 문자를 포함하며, 'X', 'O', '.' 중 하나이다. '.'은 빈칸을 의미하며, 9개의 문자는 게임판에서 제일 윗 줄 왼쪽부터의 순서이다. 입력의 마지막에는 문자열 "end"가 주어진다.

출력

각 테스트 케이스마다 한 줄에 정답을 출력한다. 가능할 경우 "valid", 불가능할 경우 "invalid"를 출력한다.

 


 

 

구현문제.

그냥 모든 게임이 진행되면서 가능성이 있는 경우를 생각해야 하는 구현문제이다.

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {

    static String INVALID = "invalid";
    static String VALID = "valid";
    static String line = "";
    static int[][] winBoard = {
            {0, 1, 2}, {3, 4, 5}, {6, 7, 8}, // 가로
            {0, 3, 6}, {1, 4, 7}, {2, 5, 8}, // 세로
            {0, 4, 8}, {2, 4, 6} // 대각선
    };
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        while (true) {
            line = br.readLine();
            if (line.equals("end")) break;
            else {
                System.out.println(simulation(line));
            }
        }

        br.close();
    }

    static String simulation(String line) {
        int o_count = 0;
        int x_count = 0;
        for (char ch : line.toCharArray()) {
            if (ch == 'O') o_count ++;
            if (ch == 'X') x_count ++;
        }
//        System.out.println(line + "\no=" + o_count + ", x=" + x_count);

        if (x_count > 5 || o_count > 4 || x_count - o_count > 1 || x_count - o_count < 0)
        {
//            System.out.println("경곗값 초과");
            return INVALID;
        }



        boolean o_wins = isWin('O');
        boolean x_wins = isWin('X');
//        System.out.println("o_wins=" + o_wins + ", x_wins=" + x_wins);

        if (o_wins && x_wins) {
//            System.out.println("둘다 이길 수 없음");
            return INVALID;
        }

        if (o_wins && o_count != x_count) {
//            System.out.println("o가 이겻는데 왜 카운트가 같지않아?");
            return INVALID;
        }

        if (x_wins && x_count - o_count != 1) {
//            System.out.println("x가 이겼는데 왜 카운트가 1차이가 아니야?");
            return INVALID;
        }

        if (!x_wins && !o_wins && x_count != 5 && o_count != 4) {
//            System.out.println("다 채운 것도 아닌데 왜 승자가 없어?");
            return INVALID;
        }

        return VALID;
    }

    static boolean isWin(char ch) {
        for (int[] rows : winBoard) {
            if (line.charAt(rows[0]) == ch
                    && line.charAt(rows[1]) == ch
                    && line.charAt(rows[2]) == ch
            ) {
                return true;
            }
        }

        return false;
    }
}

'코딩테스트' 카테고리의 다른 글

[백준 22251] 빌런 호석 (골드5)  (0) 2025.01.26
[백준 2668] 숫자고르기 (골드5)  (0) 2025.01.21
[백준 2467] 용액 (골드5)  (0) 2025.01.18
[백준 5972] 택배 배송 (골드5)  (0) 2025.01.15
[백준 2493] 탑 (골드5)  (1) 2025.01.15

+ Recent posts