[BOJ/C++] 7682 틱택토

Hanbi·2024년 4월 15일
0

Problem Solving

목록 보기
108/108
post-thumbnail

문제

https://www.acmicpc.net/problem/7682

풀이

처음에는
invalid인 경우
1. 이긴 사람이 두명이면 안 됨
2. X 개수가 O 개수보다 많으면 X가 이겨야 함 (O가 이기면 invalid)
3. X 개수랑 O 개수가 같으면 O가 이겨야 함 (X가 이기면 invalid)
4. 게임판이 꽉 찬 경우, X가 이기거나 or 무승부로 끝나야 함
이런 식으로 경우를 생각해줬는데 계속 10%에서 틀려서 다른 사람 풀이 참고해 경우를 나눠줬다.

  1. X가 이기는 경우
  • O는 빙고가 만들어지면 안 됨
  • X 개수가 무조건 O 개수보다 1개 많아야 함
  1. O가 이기는 경우
  • X는 빙고가 만들어지면 안 됨
  • X 개수랑 O 개수는 같아야 함
  1. 비기는 경우
  • X 5개, O 4개, X 빙고 없음, O 빙고 없음

이 외 경우는 전부 "invalid"

구현 문제 풀 때는 반례 나오지 않도록 명확하게 기준을 나눠서 처리해주자💦

코드

#include <iostream>
#include <string>

using namespace std;

int test(string s, int num1, int num2) {
	int mark = 0;
	int cnt1 = 0, cnt2 = 0;
	for (int i = 0; i <= 2; i++) {
		char c = s[3 * i];
		if (c == '.')	continue;
		if (mark == 1)	continue;
		if (c == s[3 * i + 1] && c == s[3 * i + 2]) {
			if (c == 'O') { mark = 1; cnt1++; }
			else { mark = 2; cnt2++; }
		}
	}

	for (int i = 0; i <= 2; i++) {
		char c = s[i];
		if (c == '.')	continue;
		if (mark == 1)	continue;
		if (c == s[i + 3] && c == s[i + 6]) {
			if (c == 'O') { mark = 1; cnt1++; }
			else { mark = 2; cnt2++; }
		}
	}

	char c = s[4];
	if (c != '.' && mark == 0) {
		if (c == s[0] && c == s[8]) {
			if (c == 'O') { mark = 1; cnt1++; }
			else { mark = 2; cnt2++; }
		}
		if (c == s[2] && c == s[6]) {
			if (c == 'O') { mark = 1; cnt1++; }
			else { mark = 2; cnt2++; }
		}
	}

	if (mark == 2) { //X 승리
		if (cnt1 != 0)	mark = 0;
		if (num1 - num2 != 1)	mark = 0;
	}
	else if (mark == 1) { //O 승리
		if (cnt2 != 0)	mark = 0;
		if (num1 != num2)	mark = 0;

	}
	else { //비길때
		if (num1 == 5 && num2 == 4 && cnt1 == 0 && cnt2 == 0) { mark = 1; }
		else { mark = 0; }
	}

	return mark;
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	while (1) {
		string str;
		string ans = "";
		int mark = 0;
		cin >> str;

		if (str == "end")	break;

		int cnt_x = 0, cnt_o = 0;
		for (int i = 0; i <= 9; i++) {
			if (str[i] == 'X')	cnt_x++;
			if (str[i] == 'O')	cnt_o++;
		}

		if (cnt_x - cnt_o == 1 || cnt_x - cnt_o == 0) {
			mark = test(str, cnt_x, cnt_o);
			if (mark)	ans = "valid";
			else { ans = "invalid"; }
		}
		else {
			ans = "invalid";
		}

		cout << ans << '\n';
	}

	return 0;
}
profile
👩🏻‍💻

0개의 댓글