07
23

문제 개요

첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스의 첫째 줄에는 참여하는 로봇의 수 N이 주어진다. 다음 N개 줄에는 각 로봇에 저장되어 있는 문자열이 주어진다. 모든 로봇의 문자열의 길이는 k이다. (2 ≤ N ≤ 10, 3 ≤ k ≤ 30) 로봇은 주어지는 순서대로 1번부터 번호를 매긴다.

아이디어

각 라운드마다 v[0][i], v[1][i]...v[n-1][i]가 대결함. 즉 v[j][i]에서 R,S,P중 뭐가 나오는지 봐야함

각 라운드별로 R,S,P중 뭐가 나왔는지 카운트를 해 줌. 이 카운트 수는 경우의 수를 나누는 과정이다. sum이 1이거나(즉 모두가 같은거를 냈거나) sum이 3이면 (즉 R,S,P 다 나오면) 비긴거니까 패스. sum이 2인 경우만 진 거를 없애준다.

진 거는 X를 30번 쓰는걸로 바꿔줌ㅋㅋㅋㅋ

그렇게 모든 라운드를 다 지난 뒤에 살아있는 로봇 개수를 세어줘서 2개 이상이 살아있으면 비긴거니까 0 출력, 하나밖에 없으면 ans 출력한다.

코드

#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<math.h>
#include<stack>
using namespace std;
int t, n;
string tmp;
vector<string> v;
void solve() { // 각 테스트케이스마다
	ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);

	v.clear();
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> tmp; v.push_back(tmp);
	}

	int round = v[0].length();
	int check[3];
	for (int i = 0; i < round; i++) {
		fill_n(check, 3, -1); // 초기화

		// 각 라운드마다 v[0][i], v[1][i]...v[n-1][i]가 대결함
		// 즉 v[j][i]에서 R,S,P중 뭐가 나오는지 봐야함
		
		for (int j = 0; j < v.size(); j++) {
			if (v[j][i] == 'R') check[0] = 1;
			if (v[j][i] == 'S') check[1] = 1;
			if (v[j][i] == 'P') check[2] = 1;
		}
		int sum = 0;
		for (int j = 0; j < 3; j++) if (check[j] == 1) sum++;
		if (sum == 3 || sum==1) { // 비김
			// 아무것도 할 필요 없음
		}
		else if (sum == 2) { // 진 거를 없애준다
			if (check[0] == -1) { // S이김 P짐
				for (int j = 0; j <v.size(); j++) {
					if (v[j][i] == 'P') {
						v[j] = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
					}
				}
			}
			else if (check[1] == -1) { // R짐 P이김
				for (int j = v.size() - 1; j >= 0; j--) {
					if (v[j][i] == 'R') {
						v[j] = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
					}
				}
			}
			else if(check[2] == -1){ // R이김 S짐
				for (int j = v.size() - 1; j >= 0; j--) {
					if (v[j][i] == 'S') {
						v[j] = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
					}
				}
			}
			else cout << "뭔가 에러남\n";
		}
	//	printf("round:%d\n---------\n", i);
		for (int j = 0; j < v.size(); j++) {
	//		cout << "로봇" << j << ": " << v[j] << "\n";
		}
	}
	// 결론내기
	int sum = 0, ans;
	for (int j = 0; j < v.size(); j++) {
		if (v[j][0] != 'X') { // 살아있는 로봇
			sum++;
			ans = j+1;
		}
		if (sum >= 2) { // 비김
			cout << "0" << "\n";
			return;
		}
	}
	cout << ans << "\n";
	return;
}
int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);
	cin >> t;
	while (t--) solve();
	return 0;
}

COMMENT