알고리즘

[C++] G5 백준 7682 - 틱택토(너 틱택토 좀 치냐?)

셓셓 2025. 6. 28. 19:20

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>
오랜만에 본가에 왔다. 가족사진 넣은 케이쿠 주문제작 해옴!ㅎ
나의 초중고 시절 자료들을 정리했는데 별의별 자료가 다 나옴
어우 적을게 많은데 차라리 새로 글을 작성해야겠다