프로그래머스 혼자서 하는 틱택토 c++ 풀이

c4fiber·2023년 2월 27일
0

code-interview

목록 보기
3/12

주어진 틱택토 진행상황에 따라 올바르게 진행된 게임인지 아닌지를 판단하는 문제


틱택토 게임이 정상적으로 종료되는 조건을 최대한 생각해보니

  1. O가 승리할 경우 -> O가 X보다 하나 더 많음
  2. X가 승리할 경우 -> O의 개수와 X의 개수가 같음
  3. 9턴을 모두 채워도 승자가 없을경우

반대로 생각해보면

  1. O가 승리했는데 O - X != 1
  2. X가 승리했는데 O - X != 0
  3. 둘 다 승리

세가지 조건에 집중에서 풀이 했다.

풀이

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

// 주어진 mark의 개수를 확인하는 기능 (O or X)
int countMark(vector<string> board, char mark) {
    int count = 0;
    for(int i=0; i<3; i++) {
        for(int j=0; j<3; j++) {
            if (board[i][j] == mark) count++;
        }
    }

    return count;
}

// 해당 player가 이겼는지 확인하는 기능 (O or X)
bool playerWin(vector<string> board, char player) {
    for(int i=0; i<3; i++) {
        if (board[i][0] == player && board[i][0] == board[i][1] && board[i][1] == board[i][2])
            return true;

        if (board[0][i] == player && board[0][i] == board[1][i] && board[1][i] == board[2][i])
            return true;
    }

    if (board[0][0] == player && board[0][0] == board[1][1] && board[1][1] == board[2][2])
        return true;

    if (board[2][0] == player && board[2][0] == board[1][1] && board[1][1] == board[0][2])
        return true;

    return false;
}

// 공평하게 턴이 주어졌는지 확인하는 기능
bool fairTurn(vector<string> board) {
    int countX = 0;
    int countO = 0;
    for(int i=0; i<3; i++) {
        for(int j=0; j<3; j++) {
            if (board[i][j] == 'O') countO++;
            if (board[i][j] == 'X') countX++;
        }
    }

    if (countO - countX > 1 || countO < countX) return false;

    return true;
}


int solution(vector<string> board) {
    int cntO = countMark(board, 'O');
    int cntX = countMark(board, 'X');

    // 공평한 턴이 주어지지 않은 
    if (!fairTurn(board))
        return 0;

    // O가 이겼는데 X를 뒀을경우
    if (playerWin(board, 'O') && cntO - cntX != 1)
        return 0;

    // X가 이겼는데 O를 뒀을경우
    if (playerWin(board, 'X') && cntO - cntX != 0)
        return 0;

    // 둘 다 이기는 경우
    if (playerWin(board, 'O') && playerWin(board, 'X'))
        return 0;


    return 1;
}

생각보다 어려웠다.

profile
amazing idiot

0개의 댓글