[Programmers] 혼자서 하는 틱택토(LV.2)

Alice·2023년 5월 25일
0
post-thumbnail

풀이 소요시간 : 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;
}
profile
거창하지 않아도, 늘 꾸준히 기록하는 습관

0개의 댓글