알고리즘/프로그래머스

[프로그래머스] 혼자서 하는 틱택토 C++ 풀이 및 해설

승민아 2024. 3. 20. 17:28

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

풀이 방법

  • 먼저 올바른 틱택토라고 가정하고 answer를 1로 초기화한다.
  • 다음과 같은 올바른 틱택토가 될 수 없는 상황을 통해 answer를 0으로 초기화 하자.
  1. 판을 보니 승자가 한명이 아니다.
  2. 한번씩 번갈아 놓지 않은 상황이다. 누구 하나가 연속으로 둠
  3. X는 후공이라 O의 개수보다 많을 수 없다.
  4. 선공이 이겼을땐 후공의 개수+1이 선공의 개수가 된다.
  5. 후공이 이겼을땐 선공의 개수와 동일하여야한다.

 

전체 코드

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

int solution(vector<string> board) {
    int answer = 1;
    int o=0;
    int x=0;
    
    for(int i=0; i<3; i++) {
        for(int j=0; j<3; j++) {
            if(board[i][j]=='O')
                o++;
            else if(board[i][j]=='X')
                x++;
        }
    }
    
    int xWin = 0;
    int oWin = 0;
    
    // 가로
    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] == 'X')
                xWin++;
            else
                oWin++;
        }
    }

    // 세로
    for(int j=0; j<3; j++) {
        if (board[0][j]!='.' && board[0][j] == board[1][j] && board[1][j] == board[2][j]) {
            if (board[0][j] == 'X')
                xWin++;
            else
                oWin++;
        }
    }
    
    // 대각선
    if (board[0][0]!='.' && board[0][0] == board[1][1] && board[1][1] == board[2][2]) {
        if (board[0][0] == 'X')
            xWin++;
        else
            oWin++;
    }
    if (board[2][0]!='.' && board[2][0] == board[1][1] && board[1][1] == board[0][2]) {
        if (board[2][0] == 'X')
            xWin++;
        else
            oWin++;
    }   
    
    // 승자가 1명이 아님
    if(oWin>0 && xWin>0)
        answer=0;
    
    // testCase 10 - 번갈아 놓지 않고 누군가 연속으로 놓아서 개수의 차이가 2이상임
    if(abs(x-o)>1)
        answer=0;
    
    // TestCase 2,5 - X가 O보다 많음
    if(x>o)
        answer=0;
    
    //선공이 이겼을때 x+1이 o여야함.
    if(oWin>0 && o!=x+1)
        answer=0;
    
    //후공이 이겼을때 x와o의 개수가 같아야함
    if(xWin>0 && o!=x)
        answer=0;
    
    return answer;
}