C++:: 프로그래머스 <혼자서 하는 틱택토>

jahlee·2023년 3월 7일
0

프로그래머스_Lv.2

목록 보기
2/106
post-thumbnail

먼저 완성되으면 0을 반환 해야한다는 점으로 잘못 생각해서 시간을 많이 버렸다.
문제의 핵심은 이 틱택토가 규칙을 따라서 진행이 되었는가를 판별한다는 것이다.
가장 핵심적인 판별법은 ooo로 완성이 되었을때는 o의 개수가 x의 개수보다는 하나 많아야하고
xxx로 완성 되었을때는 o의 개수가 x의 개수와 같아야한다.

#include <string>
#include <vector>

using namespace std;

int solution(vector<string> board)
{
    int cnt = 0, ooo = 0, xxx = 0;
    for(int i=0;i<3;i++)
    {
        for(int j=0;j<3;j++)
        {
            if(board[i][j] == 'O') cnt++;
            else if(board[i][j] == 'X') cnt--;
        }     
    }
    if (cnt == 1 || cnt == 0)// 정상적인 ox개수이라면
    {
        for(int i=0;i<3;i++)
        {
            if(board[i][0] != '.' && board[i][0] == board[i][1] && board[i][1] == board[i][2])//가로 완성 체크
            {
                if(board[i][0] == 'O') ooo++;
                else xxx++;
            }
            if(board[0][i] != '.' && board[0][i] == board[1][i] && board[1][i] == board[2][i])//세로 완성 체크
            {
                if(board[0][i] == 'O') ooo++;
                else xxx++;
            }          
        }
        if (board[0][0] != '.' && board[0][0] == board[1][1] && board[1][1] == board[2][2])//대각 완성 체크
        {
            if(board[0][0] == 'O') ooo++;
            else xxx++;
        }
        if (board[0][2] != '.' && board[0][2] == board[1][1] && board[1][1] == board[2][0])//대각 완성 체크
        {
            if(board[0][2] == 'O') ooo++;
            else xxx++;
        }
        if ((cnt == 0 && ooo) || (cnt == 1 && xxx)) return 0;// ooo완성이 되었는데 x를 둔경우 || xxx완성이 된 후에 o를 둔경우
        return 1;
    }
    return 0;
}

반례 예시

문제가 단순하다 생각하고 풀었다가 반환 예시를 생각해내는데 고생을 했다.
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
ooo
xxx
xxo => o선공 조건 어김 => 반환 0
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
ooo
xxx
xoo => xxx이미 만족 되었는데 o를 둔 경우 => 반환 0
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
ooo
x.x
xox => ooo이미 만족 되었는데 x를 둔 경우 => 반환 0
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

0개의 댓글