알고리즘/[ Baekjoon ]

[ BOJ ][JAVA][7682] 틱택토

kim.svadoz 2021. 5. 20. 16:59
728x90
반응형

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

 

7682번: 틱택토

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

www.acmicpc.net

시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초 128 MB 1175 370 258 30.824%

문제

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

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

입력

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

출력

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

예제 입력 1

XXXOO.XXX
XOXOXOXOX
OXOXOXOXO
XXOOOXXOX
XO.OX...X
.XXX.XOOO
X.OO..X..
OOXXXOOXO
end

예제 출력 1

invalid
valid
invalid
valid
valid
invalid
invalid
invalid

코드

/*
    틱택토
    해당 배치가 최종적으로 끝날 수 있는 상태인지 판별

    규칙을 싹 다 찾아보자.
*/
import java.io.*;
import java.util.*;
public class p7682 {
    static char[][] map;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        while (true) {
            String line = br.readLine();
            if (line.equals("end")) break;

            map = new char[3][3];
            for (int i = 0; i < 9; i++) {
                map[i / 3][i % 3] = line.charAt(i);

            }

            if (test(map)) {
                System.out.println("valid");
            } else {
                System.out.println("invalid");
            }

        }
    }

    static boolean test(char[][] map) {
        boolean ret = false;
        int oCnt = 0, xCnt = 0, empty = 0;
        for (int i = 0; i < 9; i++) {
            if (map[i / 3][i % 3] == 'X') {
                xCnt++;
            } else if (map[i / 3][i % 3] == 'O') {
                oCnt++;
            } else {
                empty++;
            }
        }

        if (xCnt + oCnt == 9) {
            if (xCnt - 1 != oCnt || isValid(map, 'O')) {
                return false;
            }
            return true;
        } else {
            // O로 끝나야함
            if (xCnt == oCnt) {
                boolean isO = isValid(map, 'O');
                boolean isX = isValid(map, 'X');
                if (isO && !isX) {
                    return true;
                } else {
                    return false;
                }
            } 
            // X로 끝나야 함
            else if (xCnt - 1 == oCnt) {
                boolean isO = isValid(map, 'O');
                boolean isX = isValid(map, 'X');
                if (!isO && isX) {
                    return true;
                } else {
                    return false;
                }
            }
        }

        return ret;
    }

    static boolean isValid(char[][] map, char c) {
        // 가로
        for (int i = 0; i < 3; i++) {
            if (map[i][0] == c && map[i][1] == c && map[i][2] == c) {
                return true;
            }
        }

        // 세로
        for (int i = 0; i < 3; i++) {
            if (map[0][i] == c && map[1][i] == c && map[2][i] == c) {
                return true;
            }
        }

        // 대각선
        if (map[0][0] ==  c && map[1][1] == c && map[2][2] == c) {
            return true;
        }
        if (map[0][2] ==  c && map[1][1] == c && map[2][0] == c) {
            return true;
        }

        return false;
    }
}
728x90
반응형

'알고리즘 > [ Baekjoon ]' 카테고리의 다른 글

[ BOJ ][JAVA][19622] 회의실 배정 3  (1) 2021.05.21
[ BOJ ][JAVA][10775] 공항  (0) 2021.05.20
[ BOJ ][JAVA][3184] 양  (0) 2021.05.20
[ BOJ ][JAVA][1926] 그림  (0) 2021.05.20
[ BOJ ][JAVA][19947] 투자의 귀재 배주형  (0) 2021.05.19