본문 바로가기
프로그래머스/C

[프로그래머스/C]프로그래머스 Level 2 : 혼자서 하는 틱택토 C언어

by starfish22 2023. 5. 8.
728x90

▶문제 : 코딩테스트 연습 - 혼자서 하는 틱택토 | 프로그래머스 스쿨 (programmers.co.kr)

 

프로그래머스

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

programmers.co.kr

 

▶코드 작성

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

int solution(const char *board[], size_t board_len) {
    int oSum = 0, xSum = 0;
    int oCntW, xCntW, oCntH, xCntH;
    int oWin = 0, xWin = 0;

    for (int i = 0; i < 3; i++) {
        oCntW = xCntW = oCntH = xCntH = 0;
        for (int j = 0; j < 3; j++) {
            if (board[i][j] == 'O') oCntW++; //가로줄 O 개수
            else if (board[i][j] == 'X') xCntW++;//가로줄 X 개수

            if (board[j][i] == 'O') oCntH++; //세로줄 O 개수
            else if (board[j][i] == 'X') xCntH++;//세로줄 X 개수
        }
        if (oCntW == 3 || oCntH == 3) oWin++;//한 줄 O 빙고
        if (xCntW == 3 || xCntH == 3) xWin++;//한 줄 X 빙고
        oSum += oCntW;//O 총 개수
        xSum += xCntW;//X 총 개수
    }

    if (board[1][1] != '.') {
        if (board[1][1] == board[0][0] && board[1][1] == board[2][2])//대각선 성공
            (board[1][1] == 'O') ? oWin++ : xWin++;

        if (board[1][1] == board[0][2] && board[1][1] == board[2][0])
            (board[1][1] == 'O') ? oWin++ : xWin++;
    }

    if (oWin > 0 && xWin == 0 && oSum - xSum == 1) return 1; // O가 이겼을 때
    else if (xWin > 0 && oWin == 0 && oSum - xSum == 0) return 1;// X가 이겼을 때
    else if (oWin == 0 && xWin == 0 && (oSum == xSum || oSum == xSum + 1))
        return 1;// 게임 진행 중 or 무승부
    else return 0;
}

 

▶해석

이 문제의 핵심은 O가 선공을 한다는 것이다.

따라서 O의 개수는 X와 같거나 하나 더 많다.

 

게임의 상황을 확인하기 위해

oCnt, xCnt : 한 줄(가로 : W, 세로 : H)의 O, X의 개수

oWin, xWin : O 또는 X가 한 줄이 완성된 횟수(가로, 세로, 대각)

oSum, xSum : 각 표시의 총 개수

이렇게 먼저 구해서 판별하였다.

 

규칙을 지켜서 틱택토를 진행했을 때 나올 수 있는 게임 상황이 1을 반환하므로

1) O가 이겼을 때

O가 한 줄로 채워진 개수 oWin이 0보다 크고

X가 한 줄로 채워진 개수 xWin이 0이고

마지막에 표시한 것이 O 이므로 O의 총개수에서 X의 총개수를 빼면 1이 나온다.

 

2) X가 이겼을 때

O가 한 줄로 채워진 개수 oWin이 0이고

X가 한 줄로 채워진 개수 xWin이 0보다 크고

마지막에 표시한 것이 X 이므로 O의 총개수에서 X의 총개수를 빼면 0이 나온다.

 

3) 게임 진행 중 또는 무승부

두 경우 모두 한 줄을 완성하지 못하므로 oWin, xWin 둘 다 0

마지막에 표시한 것이 O가 될 수 있고, X가 될 수 있으므로

oSum과 xSum은 같거나 oSum이 1 더 많다.

728x90

댓글