티스토리 뷰
#include <string>
#include <vector>
using namespace std;
bool check(vector<string>board, char c)
{
if(board[0][0] == c && board[1][1] == c && board[2][2] == c) return 1; //대각선 체크
if(board[0][2] == c && board[1][1] == c && board[2][0] == c) return 1;
for(int i=0; i<3; i++)
{
if(board[i][0] == c && board[i][1] == c && board[i][2] == c) return 1; //가로 체크
if(board[0][i] == c && board[1][i] == c && board[2][i] == c) return 1; //세로 체크
}
return 0;
}
int solution(vector<string> board) {
int answer = 1;
int oCnt = 0, xCnt = 0;
for(auto i : board)
{
for(int j=0; j<i.size(); j++)
{
if(i[j]=='O') oCnt++;
else if(i[j]=='X') xCnt++;
}
}
bool oWin = check(board, 'O');
bool xWin = check(board, 'X');
if(oCnt < xCnt || oCnt-xCnt >= 2) answer = 0;
if(oWin && xWin) answer = 0;
if(oWin && oCnt <= xCnt) answer = 0;
if(xWin && oCnt > xCnt) answer = 0;
return answer;
}
가능한 경우의 수가 적기 때문에, 직접 카운팅을 해주며 판단이 가능하다.
우선 O는 선공, X는 후공이기에 O의 개수가 X의 개수보다 무조건 많을 수 밖에 없다.
또한 번갈아가면서 놓기에, O의 개수가 X의 개수보다 2이상 많을 수는 없다.
그리고 간단하게 체크 가능한 것은 당연하게도 O와 X 둘 다 이기는 경우는 불가능하다.
O가 이기는 경우는, O의 개수가 무조건 X의 개수보다 많아야 한다. (O가 이기면 X 놓기가 불가능)
X가 이기는 경우는, O의 개수가 X의 개수와 같아야 한다.
위 경우의 수를 따지면 O의 개수와 X의 개수가 필요하다는 것을 알 수 있기에, 먼저 각각의 개수를 카운팅해준다.
그다음으로는 O나 X가 이기는 지 여부를 체크해주어야 한다.
사이즈가 3x3 밖에 안되기에 대각선 2개, 가로 3개, 세로 3개의 경우 밖에 없으며, 모두 직접 위치를 파악해 체크가 가능하다.
'프로그래머스 > 2레벨' 카테고리의 다른 글
[프로그래머스 2레벨] 요격 시스템 (C++) (0) | 2025.05.19 |
---|---|
[프로그래머스 2레벨] 두 원 사이의 정수 쌍 (C++) (0) | 2025.05.17 |
[프로그래머스 2레벨] N-Queen (C++) (0) | 2025.05.16 |
[프로그래머스 2레벨] 지게차와 크레인 (C++) (0) | 2025.05.15 |
[프로그래머스 2레벨] 과제 진행하기 (C++) (0) | 2025.05.07 |