1. 문제 링크
https://www.acmicpc.net/problem/7682
소요 시간 : 46분
시도 횟수 : 2

2. 문제 설명
난이도 : G5
사용 알고리즘 : 구현(아닐 줄 알았음!)

틱텍토 게임의 결과가 될 수 있는 상태인지를 확인하는 문제
3. 풀이 방식
어떤 경우가 있을 수 있을까 생각해봤다.
가로, 세로, 대각선 3가지 경우
X, O의 개수(둘이 같거나 X가 하나 더 많거나)
둘 중 최대 하나만 이어져있어야 함
이 조건만 확인하면 될 듯 했다.

4. 풀이 실패 원인 분석 + 해결
승부가 결정되지 않는 상황에 대해 처리를 안 해줬어서 1번 틀린 후 Pass~
#include<iostream>
#include<string>
using namespace std;
bool is_x, is_o;
void check(string s, int i) {
if (s[i] == 'X') is_x = true;
else is_o = true;
}
int main() {
string s;
cin >> s;
while (s != "end") {
is_x = false, is_o = false;
int cnt_x = 0, cnt_o = 0;
for (int i = 0; i < 9; i++) {
if (s[i] == '.') continue;
else if (s[i] == 'X') cnt_x++;
else cnt_o++;
if (i == 0 || i == 3 || i == 6) {//가로 3개인 경우
if (s[i] == s[i + 1] && s[i] == s[i + 2]) {
check(s, i);
}
}
if (i == 0 || i == 1 || i == 2) {//세로 3개인 경우
if (s[i] == s[i + 3] && s[i] == s[i + 6]) {
check(s, i);
}
}
if (i == 0) {
if (s[i] == s[4] && s[i] == s[8]) {
check(s, i);
}
}
if (i == 2) {
if (s[i] == s[4] && s[i] == s[6]) {
check(s, i);
}
}
}
if (cnt_x == cnt_o && !is_x && is_o) {
cout << "valid";
}
else if (cnt_x == cnt_o + 1 && is_x && !is_o) {
cout << "valid";
}
else if (cnt_x == 5 && cnt_o == 4 && !is_x && !is_o) cout << "valid";
else cout << "invalid";
cout << "\n";
cin >> s;
}
}
<오늘의 TMI>
오랜만에 본가에 왔다. 가족사진 넣은 케이쿠 주문제작 해옴!ㅎ
나의 초중고 시절 자료들을 정리했는데 별의별 자료가 다 나옴
어우 적을게 많은데 차라리 새로 글을 작성해야겠다
'알고리즘' 카테고리의 다른 글
| [C++] G5 백준 3987 - 보이저 1호 (1) | 2025.07.03 |
|---|---|
| [C++] G5 백준 2666 - 벽장문의 이동 (4) | 2025.06.29 |
| [C++]G5 백준 19940 - 피자 오븐 (0) | 2025.06.27 |
| [C++]G5 백준 12904 - A와 B (0) | 2025.06.27 |
| [C++]G5 백준 15591 - MooTube (Silver) (0) | 2025.06.27 |