알고리즘 문제/프로그래머스

프로그래머스 혼자서 하는 틱택토 [Lv. 2] (C++)

우대비 2024. 11. 6. 12:20
반응형
 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

틱택톡 결과를 입력받았을 때, 정상적으로 진행한 것인지 체크해 주세요.

 

풀이 방법

저는 정상적으로 진행되지 않은 경우는 어떠한 것이 있는지 체크하는 방식으로 접근했습니다.

 

게임의 진행은 항상 O가 선공, X가 후공이기 때문에

O의 수는 X의 수보다 작을 수가 없으며, 2개 이상 클 수도 없습니다. 

따라서 첫번째 경우O의 수가 X의 수보다 작거나 2 이상으로 클 때 입니다.

 

선공은 항상 O이기 때문에 O가 이겼을 때는 O의 수가 X의 수보다 클 수밖에 없습니다.

즉, 두번 째 경우O의 승리일 때, O,X의 개수가 같은 경우입니다.

 

세번째 경우, 반대로 생각해보면 X가 이겼을때, O의 개수가 X보다 큰 경우도 없을 것 입니다.

네 번째 경우, 만약 둘다 승리 조건을 완성 했다면 이 또한 정상적인 진행이라고 보기도 어렵습니다.

 

따라서, 우선적으로 O, X의 개수를 찾아주고, O와 X의 승리 조건 완성 여부를 파악해주어야 합니다.

이후 개수와 승리 여부를 가지고 위의 경우들에 만족하는지 확인하면 되겠습니다.

 

 

정답 코드

#include <string>
#include <vector>
#include <algorithm>
using namespace std;

bool winnerCheck(vector<string>& b, char c)
{
    if (b[0][0] == c && b[0][0] == b[1][1] && b[1][1] == b[2][2])
        return true;
    if (b[0][2] == c && b[0][2] == b[1][1] && b[1][1] == b[2][0])
        return true;

    for (int i = 0; i < 3; i++)
    {
        if (b[i][0] == c && b[i][0] == b[i][1] && b[i][1] == b[i][2])
            return true;
        if (b[0][i] == c && b[0][i] == b[1][i] && b[1][i] == b[2][i])
            return true;
    }
    return false;
}

int solution(vector<string> board) {

    int oCnt = 0;
    int xCnt = 0;
    for (string& b : board)
    {
        oCnt += count(b.begin(), b.end(), 'O');
        xCnt += count(b.begin(), b.end(), 'X');
    }
    
    bool isOWinner = winnerCheck(board, 'O');
    bool isXWinner = winnerCheck(board, 'X');
    
    if (oCnt < xCnt || oCnt > xCnt+1)
        return 0;
    if (isOWinner && isXWinner)
        return 0;
    if (isOWinner && oCnt == xCnt)
        return 0;
    if (isXWinner && oCnt > xCnt)
        return 0;
    
    return 1;
}
반응형
LIST