Level 2. 혼자서 하는 틱택토
정답률이 낮은 다른 Level 2 문제에 비해 굉장히 쉬운 편이다.
- 보드 크기가 3 x 3 고정이 아니었다면, 적절한 난이도였을 텐데 고정이어서 쉽게 풀 수 있었다.
우선 O, X의 개수를 세어 (O - X) 가 0 혹은 1이 아니면 잘못된 판이다.
그리곤 승리한 경우를 확인해, O가 승리한 경우 X의 개수는 1 작고, X가 승리한 경우 O의 개수는 같다.
- 이 조건을 만족하지 못해도 잘못된 판이다.
마지막으로 O와 X가 모두 승리한 경우도 잘못된 판이다.
#include <iostream>
#include <vector>
using namespace std;
int solution(vector<string> board)
{
int nO = 0, nX = 0;
for (string& s : board)
for (char c : s)
nO += (c == 'O'),
nX += (c == 'X');
int diff = nO - nX;
if (!(diff == 0 || diff == 1))
return 0;
vector<vector<vector<int>>> vvv = {
{{0, 0}, {0, 1}, {0, 2}},
{{1, 0}, {1, 1}, {1, 2}},
{{2, 0}, {2, 1}, {2, 2}},
{{0, 0}, {1, 0}, {2, 0}},
{{0, 1}, {1, 1}, {2, 1}},
{{0, 2}, {1, 2}, {2, 2}},
{{0, 0}, {1, 1}, {2, 2}},
{{2, 0}, {1, 1}, {0, 2}}
};
bool bO = 0, bX = 0;
for (auto& vv : vvv)
{
int tO = 0;
for (auto& v : vv)
tO += (board[v[0]][v[1]] == 'O');
if (tO == 3)
{
if (nX + 1 != nO)
return 0;
bO = true;
break;
}
}
for (auto& vv : vvv)
{
int tX = 0;
for (auto& v : vv)
tX += (board[v[0]][v[1]] == 'X');
if (tX == 3)
{
if (nX != nO)
return 0;
bX = true;
break;
}
}
if (bO && bX)
return 0;
return 1;
}
'자료구조 & 알고리즘 > 프로그래머스' 카테고리의 다른 글
Level 3. 보석 쇼핑 (0) | 2023.09.03 |
---|---|
Level 2. 광물 캐기 (0) | 2023.09.02 |
Level 2. 혼자 놀기의 달인 (0) | 2023.08.31 |
Level 2. 3 x n 타일링 (0) | 2023.08.30 |
Level 2. 과제 진행하기 (0) | 2023.08.29 |