[프로그래머스] 혼자서 하는 틱택토
1. 문제
2. 개요
선공이 ‘O’, 후공이 ‘X’ 로 표시된 3 x 3 크기의 틱택토 보드가 주어진다.
주어진 틱택토 보드의 게임 상황이 가능한 경우라면 1을, 그렇지 않다면 0을 리턴하는 문제.
3. 풀이 및 코드
3-1. 풀이
틱택토는 항상 선공이 먼저 수를 두게 되어있는 게임이다. 이 점을 이용하여 현재 상황이 가능한지 아닌지를 판단할 수 있다.
게임 상황은 크게 세 가지로 나눌 수 있다.
- 아직 승부가 나지 않은 경우.
- 선공이 승리한 경우.
- 후공이 승리한 경우.
첫 번째 경우인 아직 승부가 나지 않은 경우에는 선공의 돌이 후공의 돌보다 한 개 더 많거나 두 돌의 수가 같아야만 한다.
선공이 승리한 경우에는 선공이 돌을 두고 게임이 끝났으므로 항상 후공보다 돌이 한 개 더 많아야 한다.
후공이 승리한 경우에는 반대로 후공의 차례에 게임이 끝난 것이므로 두 돌의 수가 같아야만 한다.
따라서 각 돌의 수와 선공의 승/패 여부를 파악하여 위 조건에 맞게 조건문을 작성 후 최종적인 답을 리턴해주면 된다.
3-2. C#
using System;
public class Solution {
public int solution(string[] board) {
int answer = Chk(board) ? 1 : 0;
return answer;
}
bool Chk(string[] board)
{
int firstCnt = 0;
int afterCnt = 0;
for (int i = 0; i < board.Length; i++)
{
for (int j = 0; j < board[i].Length; j++)
{
if (board[i][j] == 'O')
firstCnt++;
else if (board[i][j] == 'X')
afterCnt++;
}
}
if (afterCnt > firstCnt || firstCnt > afterCnt + 1)
return false;
if (firstCnt != afterCnt + 1 && ChkFirstWin(board))
return false;
if (firstCnt != afterCnt && ChkFirstLose(board))
return false;
return true;
}
bool ChkFirstWin(string[] board)
{
for (int i = 0; i < 3; i++)
{
if (board[i][0] == 'O' && board[i][1] == 'O' && board[i][2] == 'O')
return true;
if (board[0][i] == 'O' && board[1][i] == 'O' && board[2][i] == 'O')
return true;
}
if (board[0][0] == 'O' && board[1][1] == 'O' && board[2][2] == 'O')
return true;
if (board[0][2] == 'O' && board[1][1] == 'O' && board[2][0] == 'O')
return true;
return false;
}
bool ChkFirstLose(string[] board)
{
for (int i = 0; i < 3; i++)
{
if (board[i][0] == 'X' && board[i][1] == 'X' && board[i][2] == 'X')
return true;
if (board[0][i] == 'X' && board[1][i] == 'X' && board[2][i] == 'X')
return true;
}
if (board[0][0] == 'X' && board[1][1] == 'X' && board[2][2] == 'X')
return true;
if (board[0][2] == 'X' && board[1][1] == 'X' && board[2][0] == 'X')
return true;
return false;
}
}
Comments