Baekjoon

Baekjoon 7682번 틱택토

ppwag 2020. 12. 3. 09:34

문제

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

걸린 시간

01 : 12 : 40

풀이

C++

#include <bits/stdc++.h>
#define INF 1e9
#define all(c) c.begin(), c.end()
typedef long long ll;
typedef unsigned long long ull;
using namespace std;

string p; // piece
char board[3][3];
int Ocnt, Xcnt;
bool Owin, Xwin;

void chk(){
    Owin = false; Xwin = false;
    // -
    if(board[0][0] == board[0][1] && board[0][1] == board[0][2]) if(board[0][0] == 'O') Owin = true; else if(board[0][0] == 'X') Xwin = true;
    if(board[1][0] == board[1][1] && board[1][1] == board[1][2]) if(board[1][0] == 'O') Owin = true; else if(board[1][0] == 'X') Xwin = true;
    if(board[2][0] == board[2][1] && board[2][1] == board[2][2]) if(board[2][0] == 'O') Owin = true; else if(board[2][0] == 'X') Xwin = true;
    // |
    if(board[0][0] == board[1][0] && board[1][0] == board[2][0]) if(board[0][0] == 'O') Owin = true; else if(board[0][0] == 'X') Xwin = true;
    if(board[0][1] == board[1][1] && board[1][1] == board[2][1]) if(board[0][1] == 'O') Owin = true; else if(board[0][1] == 'X') Xwin = true;
    if(board[0][2] == board[1][2] && board[1][2] == board[2][2]) if(board[0][2] == 'O') Owin = true; else if(board[0][2] == 'X') Xwin = true;
    // x 
    if(board[0][0] == board[1][1] && board[1][1] == board[2][2]) if(board[0][0] == 'O') Owin = true; else if(board[0][0] == 'X') Xwin = true;
    if(board[0][2] == board[1][1] && board[1][1] == board[2][0]) if(board[0][2] == 'O') Owin = true; else if(board[0][2] == 'X') Xwin = true;
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    while(true){
        cin >> p;
        if(p == "end") break;
        Ocnt = 0; Xcnt = 0;
        for(int i = 0; i < 3; i++){
            for(int j = 0; j < 3; j++){
                board[i][j] = p[i*3+j];
                if(board[i][j] == 'O') Ocnt++;
                if(board[i][j] == 'X') Xcnt++;
            }
        }
        if((Ocnt+Xcnt)%2 == 0){
            if(Ocnt == Xcnt){
                // ok
            }
            else{
                cout << "invalid" << "\n";
                continue;
            }
        }
        else{
            if(Ocnt+1 == Xcnt){
                // ok
            }
            else{
                cout << "invalid" << "\n";
                continue;
            }
        }
        chk();
        if(Owin && Xwin) cout << "invalid" << "\n";
        else if(Owin && !Xwin) if(Ocnt == Xcnt) cout << "valid" << "\n"; else cout << "invalid" << "\n";
        else if(!Owin && Xwin) if(Ocnt+1 == Xcnt) cout << "valid" << "\n"; else cout << "invalid" << "\n";
        else if(Ocnt+Xcnt == 9) cout << "valid" << "\n"; else cout << "invalid" << "\n";
    }
    return 0;
}

주어진 틱택토 게임판의 상태가 최종 상태인지를 판별하는 문제이다.

반드시 첫 번째 사람이 X를 놓고 두 번째 사람이 O를 놓아야 한다는 조건을 염두에 두고, 가능한 모든 상태를 정리한 후 구현하여 풀이했다.

'Baekjoon' 카테고리의 다른 글

Baekjoon 15681번 트리와 쿼리  (0) 2020.12.04
Baekjoon 11404번 플로이드  (0) 2020.12.03
Baekjoon 1956번 운동  (0) 2020.12.02
Baekjoon 9613번 GCD 합  (0) 2020.11.23
Baekjoon 2931번 가스관  (0) 2020.11.23

댓글