프로그래머스

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

programmers.co.kr

 

일단 여기서 틱택토가 정상적으로 진행되지 않는 경우는

  • 턴이 제대로 주어지지 않음(cntX > cntO or cntO > cntX + 1) 즉, 한 쪽이 한 번 이상 더 많이 둠
  • O가 승리했는데 cntO - cntX가 1이 아님
  • X가 승리했는데 cntO == cntX가 아님
  • 둘 다 승리함 < 이거를 고려안하고 작성하다가 중간에 whoWin 메서드를 고침

이렇게 4가지다

 

위 조건을 모두 통과하면 정상적으로 틱택토가 진행된 것

#include <string>
#include <vector>

using namespace std;

// 누가 이겼는가
bool whoWin(vector<string> board, char target) {
    // 가로 세로 체크
    for(int i = 0; i < 3; i++) {
        if(board[i][0] == target && board[i][0] == board[i][1] && board[i][1] == board[i][2])
            return true;
        
        if(board[0][i] == target && board[0][i] == board[1][i] && board[1][i] == board[2][i])
            return true;
    }
    
    // 대각선 체크
    if(board[0][0] == target && board[0][0] == board[1][1] && board[1][1] == board[2][2])
        return true;
    
    if(board[2][0] == target && board[2][0] == board[1][1] && board[1][1] == board[0][2])
        return true;
    
    return false;
}

int solution(vector<string> board) {
    int cntO = 0, cntX = 0;
    
    // O와 X 수 세기
    for(int i = 0; i < 3; i++)
        for(int j = 0; j < 3; j++) {
            if(board[i][j] == 'O') cntO++;
            if(board[i][j] == 'X') cntX++;
        }
    
    // 공평한 턴이 주어졌는가
    if((cntO < cntX) || (cntO > cntX + 1)) return 0;
    // O가 이겼는데 X가 수를 뒀는가
    if(whoWin(board, 'O') && cntO - cntX != 1) return 0;
    // X가 이겼는데 O가 수를 뒀는가
    if(whoWin(board, 'X') && cntO - cntX != 0) return 0;
    // O, X 둘 다 이겼는가
    if(whoWin(board, 'O') && whoWin(board, 'X')) return 0;
    
    return 1;
}

 

+ Recent posts