풀이 소요시간 : 25분
알고리즘이 필요한 것도 아니고 시뮬레이션이 필요한 것도 아닌 단순 구현문제다. 틱택토 게임이 실패하는 경우를 잘 찾는 것이 가장 중요한데, 예시 입력 값에 워낙 설명이 잘 되어있어서 어렵지 않았다.
요즘 드는 생각인데, 철저해서 나쁠 것이 하나도 없기 때문에 조건문은 최대한 촘촘하게 작성하는 것이 좋아보인다.
#include <string>
#include <vector>
using namespace std;
char Map[4][4];
int Count_O = 0;
int Count_X = 0;
bool O_Bingo() {
//세로 빙고
for(int i = 1; i <= 3; i++) {
if(Map[i][1] == 'O' && Map[i][2] == 'O' && Map[i][3] == 'O') return true;
}
//가로 빙고
for(int i = 1; i <= 3; i++) {
if(Map[1][i] == 'O' && Map[2][i] == 'O' && Map[3][i] == 'O') return true;
}
//대각선 빙고(1)
if(Map[1][1] == 'O' && Map[2][2] == 'O' && Map[3][3] == 'O') return true;
//대각선 빙고(2)
if(Map[1][3] == 'O' && Map[2][2] == 'O' && Map[3][1] == 'O') return true;
//빙고 X
return false;
}
bool X_Bingo() {
//세로 빙고
for(int i = 1; i <= 3; i++) {
if(Map[i][1] == 'X' && Map[i][2] == 'X' && Map[i][3] == 'X') return true;
}
//가로 빙고
for(int i = 1; i <= 3; i++) {
if(Map[1][i] == 'X' && Map[2][i] == 'X' && Map[3][i] == 'X') return true;
}
//대각선 빙고(1)
if(Map[1][1] == 'X' && Map[2][2] == 'X' && Map[3][3] == 'X') return true;
//대각선 빙고(2)
if(Map[1][3] == 'X' && Map[2][2] == 'X' && Map[3][1] == 'X') return true;
//빙고 X
return false;
}
int solution(vector<string> board) {
for(int i = 0; i < board.size(); i++) {
for(int j = 0; j < board[0].length(); j++) {
Map[i + 1][j + 1] = board[i][j];
if(board[i][j] == 'O') Count_O++;
if(board[i][j] == 'X') Count_X++;
}
}
//전역 변수화
//선공 O, 후공 X
if(Count_O < Count_X || Count_O >= Count_X + 2) return 0;
// 1차 필터 : 후공이 선공보다 많거나, 선공이 후공보다 2 이상 많은 경우 -> 불가능
if(O_Bingo() == true && X_Bingo() == true) return 0;
// 2차 필터 : O 빙고 완성 && X 빙고 완성 -> 불가능
if(O_Bingo() == true && X_Bingo() == false && Count_O != Count_X + 1) return 0;
// O 완성 종료 : O 의 갯수가 X 의 갯수보다 1개 많은 경우만 가능
if(X_Bingo() == true && O_Bingo() == false && Count_O != Count_X) return 0;
// X 완성 종료 : O 의 갯수와 X 의 갯수가 동일한 경우만 가능
return 1;
}