[Baekjoon/C++] 8896번 - 가위 바위 보
[백준] Baekjoon Online Judge
문제
상근이는 가위 바위 보를 할 수 있는 로봇을 가지고 있다. 게임은 총 k번의 연속적인 라운드로 이루어져 있다.
각 로봇은 길이가 k인 문자열을 가지고 있고, 이 문자열에 의해서 게임을 하게 된다. 각 라운드에서 패배한 로봇은 더 이상 게임을 참여할 수 없고, 남은 로봇끼리 게임을 하게 된다. 로봇이 하나만 남은 경우에는 그 로봇이 게임을 승리하게 되고, 게임이 끝난다. k 라운드가 지난 후에 남아있는 로봇이 하나보다 많다면, 게임은 무승부로 끝난다.
가위는 S, 바위는 R, 보는 P로 나타낼 수 있다. 만약, 로봇이 가지고 있는 문자열이 RSPSRSSP 라면, 첫 라운드에서 로봇은 주먹을 내고, 둘째 라운드에서는 가위를 낸다. 여덟번째 라운드까지 그 로봇이 살아있다면 보를 낸다.
가위 바위 보 게임에 참여하는 로봇의 수와 각 로봇의 문자열이 주어졌을 때, 게임의 승자를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스의 첫째 줄에는 참여하는 로봇의 수 N이 주어진다. 다음 N개 줄에는 각 로봇에 저장되어 있는 문자열이 주어진다. 모든 로봇의 문자열의 길이는 k이다. (2 ≤ N ≤ 10, 3 ≤ k ≤ 30) 로봇은 주어지는 순서대로 1번부터 번호를 매긴다.
출력
각 테스트 케이스마다, 게임을 승리한 로봇의 번호를 출력한다. k 라운드가 지난 후에도 승자가 없는 경우 (무승부) 에는 0을 출력한다.
풀이
#include <iostream>
#include <queue>
using namespace std;
int N, K;
queue<pair<int, string>> robot;
void push(queue<pair<int, string>> q);
void game(int n);
int findWinner();
// q의 값들을 robot에 넣는다.
void push(queue<pair<int, string>> q) {
while (!q.empty()) {
robot.push(q.front());
q.pop();
}
}
// 가위바위보 게임
void game(int n) {
queue<pair<int, string>> S, R, P;
// 로봇이 낸 것에 따라 분류하기
while (!robot.empty()) {
int c = robot.front().second[n];
if (c == 'S') S.push(robot.front());
else if (c == 'R') R.push(robot.front());
else P.push(robot.front());
robot.pop();
}
// 가위, 바위, 보가 모두 나온 경우
if (!S.empty() && !R.empty() && !P.empty()) {
push(P);
push(S);
push(R);
return;
}
if (S.empty()) push(P);
if (R.empty()) push(S);
if (P.empty()) push(R);
}
// 승자 찾기
int findWinner() {
for (int i = 0; i < K; i++) game(i);
// k 라운드가 지난 후에도 승자가 없는 경우
if (robot.size() > 1) return 0;
return robot.front().first + 1;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int T;
cin >> T;
while (T--) {
cin >> N;
for (int i = 0; i < N; i++) {
string s;
cin >> s;
robot.push({ i, s });
}
// 라운드의 수
K = robot.front().second.length();
// 출력
cout << findWinner() << '\n';
// 초기화
robot = queue<pair<int, string>>();
}
return 0;
}
// 승자 찾기
int findWinner() {
for (int i = 0; i < K; i++) game(i);
// k 라운드가 지난 후에도 승자가 없는 경우
if (robot.size() > 1) return 0;
return robot.front().first + 1;
}
승자를 찾는 함수이다. K 라운드가 지났음에도 robot의 size가 1보다 크다면 승자가 아직 나오지 않은 것이므로 0을 return한다.
// 가위바위보 게임
void game(int n) {
queue<pair<int, string>> S, R, P;
// 로봇이 낸 것에 따라 분류하기
while (!robot.empty()) {
int c = robot.front().second[n];
if (c == 'S') S.push(robot.front());
else if (c == 'R') R.push(robot.front());
else P.push(robot.front());
robot.pop();
}
// 가위, 바위, 보가 모두 나온 경우
if (!S.empty() && !R.empty() && !P.empty()) {
push(P);
push(S);
push(R);
return;
}
if (S.empty()) push(P);
if (R.empty()) push(S);
if (P.empty()) push(R);
}
가위바위보 게임을 하는 함수이다. 로봇이 해당 라운드에 낸 것으로 로봇을 3팀으로 나눈다. 이때 각 팀이 모두 인원이 있다면 가위바위보가 모두 나온 것이므로 해당 라운드에서는 탈락자가 나오지 않으므로, P, S, R팀의 로봇들이 모두 다시 robot에 들어간다.
// q의 값들을 robot에 넣는다.
void push(queue<pair<int, string>> q) {
while (!q.empty()) {
robot.push(q.front());
q.pop();
}
}
q팀의 로봇들의 정보를 robot에 넣는 함수이다.