문제
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 |
댓글