호지

[프로그래머스] 혼자서 하는 틱택토 c++ 본문

알고리즘/프로그래머스

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

_hoji

이 문제는 경우의 수만 잘 설정하면 풀 수 있는 문제였다.

틱택토는 O가 선공이고, X가 후공일 때 가능한 경우의 수인지만 확인하면 된다.

따라서 보드 위의 O의 개수가 X와 같거나 O가 X보다 1개 많아야 한다.

 

또한 줄을 완성했으면 게임이 끝나는 경우이므로, 생각해봐야할 경우의 수는 다음과 같다.

 

1. X와 O 둘다 줄을 완성한 경우

- O나 X 둘 중 하나가 줄을 완성했다면 게임이 끝났어야 함

2. O가 줄을 완성했는데 보드 위의 O의 개수와 X의 개수가 동일한 경우

- O가 선공이므로 O가 줄을 완성해서 게임이 끝났을 때는 항상 O의 개수가 1개 더 많아야 함

3. X가 줄을 완성했는데 보드 위의 O의 개수가 X보다 1개 더 많은 경우

- X가 후공이므로 X가 줄을 완성해서 게임이 끝났을 때는 항상 O와 X의 개수가 같아야 함

 

다음과 같은 조건을 고려해서 코드를 구현하면 다음과 같다

 

#include <string>
#include <vector>
#include <iostream>

using namespace std;

int solution(vector<string> board) {
    int answer = -1;
    int cntO = 0, cntX = 0;
    for(int i=0; i<3; i++){
        for(int j=0; j<3; j++){
            if(board[i][j] == 'O')
                cntO++;
            else if(board[i][j] == 'X')
                cntX++;
        }
    }
    if(cntO != cntX && cntO != cntX + 1)
        return 0;
    
    int winO = 0, winX = 0;
      
    for(int i=0; i<3; i++){
      if(board[i][0] == board[i][1] && board[i][0] == board[i][2]){
        if(board[i][0] == 'O')
          winO++;
        else if(board[i][0] == 'X')
          winX++;
      }
      if(board[0][i] == board[1][i] && board[0][i] == board[2][i]){
        if(board[0][i] == 'O')
          winO++;
        else if(board[0][i] == 'X')
          winX++;
      }
    }
    if(board[0][0] == board[1][1] && board[0][0] == board[2][2]){
      if(board[0][0] == 'O')
        winO++;
      else if(board[0][0] == 'X')
        winX++;
    }
    if(board[0][2] == board[1][1] && board[0][2] == board[2][0]){
      if(board[0][2] == 'O')
        winO++;
      else if(board[0][2] == 'X')
        winX++;
    }
    
    if(winX !=0 && winO != 0)
        return 0;
    if(winO != 0 && cntO == cntX)
        return 0;
    if(winX != 0 && cntO == cntX + 1)
        return 0;
    
    return 1;
}

 

https://school.programmers.co.kr/learn/courses/30/lessons/160585#

Comments