[백준/BOJ] 백준 21775번 : 가희와 자원 놀이

2022. 2. 2. 23:56알고리즘 문제풀이

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

 

21775번: 가희와 자원 놀이

T턴에 걸쳐서, 각 턴에 수행된 연산 카드의 id를 한 줄에 하나씩 출력해 주세요.

www.acmicpc.net

해당 숫자를 어떤 사람이 가지고 있는지에 대한 정보를 map에 저장하여 문제를 해결했다

 

코드

#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
#include <deque>
#include <string>
using namespace std;

int n, t;
vector<int> order;
deque<int> dq;
map<int, string> id_card;
vector<int> have_id(500005, 0); //[사람 번호] = 가지고 있는 연산 카드 id
map<int, int> number_human; //(숫자, 해당 숫자를 가지고 있는 사람 번호)
vector<int> output;

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

	cin >> n >> t;

	for (int i = 0; i < t; i++)
	{
		int input;

		cin >> input;
		cin.ignore();

		order.push_back(input);
	}

	for (int i = 0; i < t; i++)
	{
		string input;
		getline(cin, input);

		int index = input.find(" ", 0);

		int id = stoi(input.substr(0, index));
		string card = input.substr(index + 1, input.size() - (index + 1));

		id_card.insert(make_pair(id, card));
		dq.push_back(id);
	}

	for (int i = 0; i < t; i++)
	{
		int this_order = order[i];
		string this_card;

		//연산카드를 가지고 있을때
		if (have_id[this_order] != 0)
		{
			this_card = id_card[have_id[this_order]];
		}

		//연산카드를 가지고 있지 않을때
		else
		{
			//카드 더미의 맨 위에서 가져와서 가진다
			have_id[this_order] = dq.front();
			dq.pop_front();

			this_card = id_card[have_id[this_order]];
		}

		output.push_back(have_id[this_order]);

		//next일때
		if (this_card[0] == 'n')
		{
			have_id[this_order] = 0; //카드 버리기
		}

		//acquire일때
		else if (this_card[0] == 'a')
		{
			int index = this_card.find(" ");
			int number = stoi(this_card.substr(index + 1, this_card.size() - (index + 1)));

			//number숫자를 가진 사람이 없을때
			if (number_human.count(number) == 0)
			{
				number_human.insert(make_pair(number, this_order));

				have_id[this_order] = 0; //카드 버리기;
			}
		}

		//release일때
		else if (this_card[0] == 'r')
		{
			int index = this_card.find(" ");
			int number = stoi(this_card.substr(index + 1, this_card.size() - (index + 1)));

			number_human.erase(number);

			have_id[this_order] = 0; //카드 버리기;
		}

	}

	for (int i = 0; i < output.size(); i++)
		cout << output[i] << "\n";

	return 0;
}