문제 개요
첫째 줄에 테스트 케이스의 개수 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;
}