[프로그래머스][C++] 혼자서 하는 틱택토
혼자서 하는 틱택토
문제 링크
분석
2차원 배열인 board
가 3x3크기로 주어집니다.
해당 배열은 "0"
, "x"
, "."
으로 이루어져 있습니다.
틱택토 게임을 올바르게 진행했을 경우 매개변수로 주어진 board
가 나올 수 있는 지 판별하고, 반환하는 문제입니다.
주요 조건은 다음과 같습니다.
"0"
가 항상 먼저 시작합니다."0"
의 수는 항상"X"
와 같거나 많습니다."0"
와"X"
의 개수 차이는 최대 1개이어야 합니다."0"
나"X"
가 가로, 세로, 대각선으로 같은 문자가 3개 연속 배치되어야 승리입니다."0"
나"X"
가 승리했다면 누군가 추가로 돌을 둘 수 없으며, 게임은 즉시 끝나야합니다.
풀이
#include <string>
#include <vector>
using namespace std;
// 보드에서 특정 플레이어가 승리했는지 확인하는 함수
bool checkWin(const vector<string>& board, char player)
{
// 가로 확인
for (int i = 0; i < board.size(); ++i)
{
if (board[i][0] == player && board[i][1] == player && board[i][2] == player)
{
return true;
}
}
// 세로 확인
for (int j = 0; j < board[0].length(); ++j)
{
if (board[0][j] == player && board[1][j] == player && board[2][j] == player)
{
return true;
}
}
// 대각선 확인
if (board[0][0] == player && board[1][1] == player && board[2][2] == player)
{
return true;
}
else if (board[0][2] == player && board[1][1] == player && board[2][0] == player)
{
return true;
}
// 승리하지 못한 경우임
return false;
}
int solution(vector<string> board) {
// O와 X의 개수를 센다.
int oCount = 0;
int xCount = 0;
for (int i = 0; i < board.size(); ++i)
{
for (int j = 0; j < board[0].length(); ++j)
{
if (board[i][j] == 'O')
{
++oCount;
}
else if (board[i][j] == 'X')
{
++xCount;
}
}
}
// X가 O 개수보다 많거나 O가 X보다 2개 이상 많다면 규칙에 위반된다.
if (xCount > oCount || oCount > xCount + 1)
{
return 0;
}
// O와 X가 승리했는지 확인하고 저장한다.
bool isOWin = checkWin(board, 'O');
bool isXWin = checkWin(board, 'X');
// 둘 다 승리한 경우 규칙에 위반된다.
if (isOWin && isXWin)
{
return 0;
}
// O가 승리했지만 X와 개수가 같다면 규칙에 위반된다.
else if (isOWin && oCount == xCount)
{
return 0;
}
// X가 승리했지만 O와 개수가 다르다면 규칙에 위반된다.
else if (isXWin && oCount != xCount)
{
return 0;
}
// 위반된 규칙이 없는 경우
return 1;
}
성능 요약
시간 복잡도는 $O(1)$의 시간 복잡도를 가집니다.
board
의 크기는 3x3으로 고정되어 있으므로 $O(1)$
공간 복잡도는 고정된 크기의 상수 공간을 사용하기 때문에 $O(1)$입니다.
테스트 성능
테스트 1 〉 통과 (0.01ms, 4.15MB)
테스트 2 〉 통과 (0.01ms, 4.22MB)
테스트 3 〉 통과 (0.01ms, 4.14MB)
테스트 4 〉 통과 (0.01ms, 4.29MB)
테스트 5 〉 통과 (0.01ms, 4.21MB)
테스트 6 〉 통과 (0.01ms, 4.15MB)
테스트 7 〉 통과 (0.01ms, 4.14MB)
테스트 8 〉 통과 (0.01ms, 4.13MB)
테스트 9 〉 통과 (0.01ms, 4.43MB)
테스트 10 〉 통과 (0.01ms, 4.21MB)
테스트 11 〉 통과 (0.01ms, 4.14MB)
테스트 12 〉 통과 (0.01ms, 4.21MB)
테스트 13 〉 통과 (0.01ms, 4.21MB)
테스트 14 〉 통과 (0.01ms, 4.16MB)
테스트 15 〉 통과 (0.01ms, 4.22MB)
테스트 16 〉 통과 (0.01ms, 4.2MB)
테스트 17 〉 통과 (0.01ms, 4.21MB)
테스트 18 〉 통과 (0.01ms, 3.68MB)
테스트 19 〉 통과 (0.01ms, 4.21MB)
테스트 20 〉 통과 (0.01ms, 4.21MB)
테스트 21 〉 통과 (0.01ms, 4.21MB)
테스트 22 〉 통과 (0.01ms, 4.21MB)
테스트 23 〉 통과 (0.01ms, 4.28MB)
테스트 24 〉 통과 (0.01ms, 4.2MB)
테스트 25 〉 통과 (0.01ms, 3.68MB)
테스트 26 〉 통과 (0.01ms, 4.21MB)
테스트 27 〉 통과 (0.01ms, 3.59MB)
테스트 28 〉 통과 (0.01ms, 4.21MB)
테스트 29 〉 통과 (0.01ms, 4.2MB)
테스트 30 〉 통과 (0.01ms, 4.21MB)
테스트 31 〉 통과 (0.01ms, 4.21MB)
테스트 32 〉 통과 (0.01ms, 4.44MB)
테스트 33 〉 통과 (0.01ms, 4.19MB)
테스트 34 〉 통과 (0.01ms, 4.02MB)
테스트 35 〉 통과 (0.01ms, 4.02MB)
테스트 36 〉 통과 (0.01ms, 4.16MB)
테스트 37 〉 통과 (0.01ms, 4.14MB)
테스트 38 〉 통과 (0.01ms, 4.18MB)
테스트 39 〉 통과 (0.01ms, 4.21MB)
테스트 40 〉 통과 (0.01ms, 4.14MB)
테스트 41 〉 통과 (0.01ms, 4.14MB)
테스트 42 〉 통과 (0.01ms, 4.14MB)
테스트 43 〉 통과 (0.01ms, 4.21MB)
테스트 44 〉 통과 (0.01ms, 3.68MB)
테스트 45 〉 통과 (0.01ms, 4.2MB)
테스트 46 〉 통과 (0.01ms, 4.2MB)
테스트 47 〉 통과 (0.01ms, 4.14MB)
테스트 48 〉 통과 (0.01ms, 4.43MB)
테스트 49 〉 통과 (0.01ms, 4.22MB)
테스트 50 〉 통과 (0.01ms, 4.21MB)
테스트 51 〉 통과 (0.01ms, 4.22MB)
테스트 52 〉 통과 (0.01ms, 3.65MB)
테스트 53 〉 통과 (0.02ms, 3.63MB)
테스트 54 〉 통과 (0.01ms, 3.68MB)
댓글남기기