728x90
▶문제 : 코딩테스트 연습 - 혼자서 하는 틱택토 | 프로그래머스 스쿨 (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
'프로그래머스 > C' 카테고리의 다른 글
프로그래머스 Level 1 : 덧칠하기 C언어 (0) | 2023.05.01 |
---|---|
프로그래머스 Level 1 : 공원 산책 C언어 (0) | 2023.04.30 |
프로그래머스 Level 1 : 문자열 나누기 C언어 (0) | 2023.04.30 |
프로그래머스 Level 1 : 바탕화면 정리 C언어 (0) | 2023.03.13 |
프로그래머스 Level 2 : 택배 배달과 수거하기 C언어 (0) | 2023.01.16 |
댓글