카테고리 없음

[Baekjoon/C++] 8896번 - 가위 바위 보

베리._. 2025. 5. 13. 17:44

[백준] 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에 넣는 함수이다.