티스토리 뷰

#include <string>
#include <vector>

using namespace std;

bool check(vector<string>board, char c)
{
    if(board[0][0] == c && board[1][1] == c && board[2][2] == c) return 1; //대각선 체크
    if(board[0][2] == c && board[1][1] == c && board[2][0] == c) return 1;
    
    for(int i=0; i<3; i++)
    {
        if(board[i][0] == c && board[i][1] == c && board[i][2] == c) return 1; //가로 체크
        if(board[0][i] == c && board[1][i] == c && board[2][i] == c) return 1; //세로 체크
    }
    return 0;
}

int solution(vector<string> board) {
    int answer = 1;
    
    int oCnt = 0, xCnt = 0;
    for(auto i : board)
    {
        for(int j=0; j<i.size(); j++)
        {
            if(i[j]=='O') oCnt++;
            else if(i[j]=='X') xCnt++;
        }
    }
    
    bool oWin = check(board, 'O');
    bool xWin = check(board, 'X');
    
    if(oCnt < xCnt || oCnt-xCnt >= 2) answer = 0;
    if(oWin && xWin) answer = 0;
    if(oWin && oCnt <= xCnt) answer = 0;
    if(xWin && oCnt > xCnt) answer = 0;
    
    
    return answer;
}

 

가능한 경우의 수가 적기 때문에, 직접 카운팅을 해주며 판단이 가능하다.

 

우선 O는 선공, X는 후공이기에 O의 개수가 X의 개수보다 무조건 많을 수 밖에 없다.

또한 번갈아가면서 놓기에, O의 개수가 X의 개수보다 2이상 많을 수는 없다.

 

그리고 간단하게 체크 가능한 것은 당연하게도 O와 X 둘 다 이기는 경우는 불가능하다.

O가 이기는 경우는, O의 개수가 무조건 X의 개수보다 많아야 한다. (O가 이기면 X 놓기가 불가능)

X가 이기는 경우는, O의 개수가 X의 개수와 같아야 한다. 

 

위 경우의 수를 따지면 O의 개수와 X의 개수가 필요하다는 것을 알 수 있기에, 먼저 각각의 개수를 카운팅해준다.

그다음으로는 O나 X가 이기는 지 여부를 체크해주어야 한다.

사이즈가 3x3 밖에 안되기에 대각선 2개, 가로 3개, 세로 3개의 경우 밖에 없으며, 모두 직접 위치를 파악해 체크가 가능하다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함