[백준 7682번 C/C++] 틱택토
[백준 7682번 C/C++] 틱택토
https://www.acmicpc.net/problem/7682
해결전략
구현
정답코드
#include <iostream>
#include <vector>
using namespace std;
vector<string> v;
bool isWin(int ny, int nx, char player) // 특정 플레이어가 이겼는지 확인하는 함수
{
// 가로 틱택토
if (v[ny][nx] == player && v[ny][nx] == v[ny][nx + 1] && v[ny][nx + 1] == v[ny][nx + 2]) return true;
if (v[ny][nx + 3] == player && v[ny][nx + 3] == v[ny][nx + 4] && v[ny][nx + 4] == v[ny][nx + 5]) return true;
if (v[ny][nx + 6] == player && v[ny][nx + 6] == v[ny][nx + 7] && v[ny][nx + 7] == v[ny][nx + 8]) return true;
// 세로 틱택토
if (v[ny][nx] == player && v[ny][nx] == v[ny][nx + 3] && v[ny][nx + 3] == v[ny][nx + 6]) return true;
if (v[ny][nx + 1] == player && v[ny][nx + 1] == v[ny][nx + 4] && v[ny][nx + 4] == v[ny][nx + 7]) return true;
if (v[ny][nx + 2] == player && v[ny][nx + 2] == v[ny][nx + 5] && v[ny][nx + 5] == v[ny][nx + 8]) return true;
// 대각선 틱택토
if (v[ny][nx] == player && v[ny][nx] == v[ny][nx + 4] && v[ny][nx + 4] == v[ny][nx + 8]) return true;
if (v[ny][nx + 2] == player && v[ny][nx + 2] == v[ny][nx + 4] && v[ny][nx + 4] == v[ny][nx + 6]) return true;
return false;
}
bool TikTakToc(int ny, int nx) // 현재의 게임판 상태가 유효한지 검사하는 함수
{
int Xnum = 0, Onum = 0;
for (int i = 0; i < 9; i++) {
if (v[ny][i] == 'X') Xnum++;
else if (v[ny][i] == 'O') Onum++;
}
// X와 O의 개수가 규칙에 맞지 않는 경우 false 반환
if (Xnum != Onum && Xnum != Onum + 1) return false;
// 각 플레이어가 이겼는지 확인
bool Xwin = isWin(ny, nx, 'X');
bool Owin = isWin(ny, nx, 'O');
// 둘 다 이긴 경우
if (Xwin && Owin) return false;
// X가 이겼는데 말을 둔 횟수가 같은 경우(O가 하나 더 적어야 한다).
if (Xwin && Xnum == Onum) return false;
// O가 이겼는데 X의 말이 더 많은 경우(O가 이기는 경우 말의 개수는 같아야 한다).
if (Owin && Xnum > Onum) return false;
// 승자가 없고 아직 게임판이 다 차지 않은 상태
if (!Xwin && !Owin && Xnum + Onum != 9) return false;
return true;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
string input;
while (cin >> input) {
if (input == "end") break;
v.emplace_back(input);
}
for (int i = 0; i < v.size(); i++) {
if (TikTakToc(i, 0))
cout << "valid" << "\n";
else
cout << "invalid" << "\n";
}
return 0;
}
'⭐ 코딩테스트 > 백준' 카테고리의 다른 글
[백준 14499번 C/C++] 주사위 굴리기 (0) | 2024.05.04 |
---|---|
[백준 1520번 C/C++] 내리막 길 (0) | 2024.04.23 |
[백준 15864번 C/C++] 사다리 조작 (1) | 2024.04.19 |
[백준 6087번 C/C++] 레이저 통신 (0) | 2024.04.16 |
[백준 2589번 C/C++] 보물선 (0) | 2024.04.15 |
댓글
이 글 공유하기
다른 글
-
[백준 14499번 C/C++] 주사위 굴리기
[백준 14499번 C/C++] 주사위 굴리기
2024.05.04 -
[백준 1520번 C/C++] 내리막 길
[백준 1520번 C/C++] 내리막 길
2024.04.23 -
[백준 15864번 C/C++] 사다리 조작
[백준 15864번 C/C++] 사다리 조작
2024.04.19 -
[백준 6087번 C/C++] 레이저 통신
[백준 6087번 C/C++] 레이저 통신
2024.04.16