[백준/BOJ] 백준 20292번 : 컨설팅

2021. 3. 25. 15:52알고리즘 문제풀이

www.acmicpc.net/problem/20292

 

20292번: 컨설팅

입력으로 최대 $10\ 000$줄의 명령어가 주어지며, WRITE문, READ문, EXIT문으로 구성된다. EXIT문은 마지막에 한 번만 주어진다. 각 명령어는 다음과 같이 정의되며, 메모리 이름은 $1$–$3$글자의 알파벳

www.acmicpc.net

multimap<string, string> write_from_to 와 multimap<string, string> write_to_from 에 write 정보를 저장하고, set<string> read에 read 정보를 저장하여 문제를 해결했다. 그리고 WAIT가 나오면 기록된 정보들을 지우는 방법으로 문제를 해결했다.

 

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

multimap<string, string> write_from_to;
multimap<string, string> write_to_from;
multimap<string, string>::iterator it;
set<string> read;
vector<string> result;

void Pre()
{
	write_from_to.clear();
	write_to_from.clear();
	read.clear();
}

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

	while (1)
	{
		string input;
		getline(cin, input);

		string a, b;
		int index1;
		int index2;
		int index3;

		if (input[0] == 'E')
		{
			result.push_back(input);

			break;
		}

		if (input[0] == 'W')
		{
			index1 = input.find(" ");
			index2 = input.find(" ", index1 + 1);
			index3 = input.find(" ", index2 + 1);

			a = input.substr(index1 + 1, index2 - (index1 + 1));
			b = input.substr(index3 + 1, input.size() - (index3 + 1));

			//read with write 조건1
			if (read.count(b) != 0)
			{
				result.push_back("WAIT");

				Pre();
			}

			//read with write 조건2 + 교착상태 조건
			else if (write_from_to.count(b) != 0 || write_to_from.count(a) != 0)
			{
				result.push_back("WAIT");

				Pre();
			}

			//write with write 조건1 + write with write 조건2
			else if (write_to_from.count(b) != 0 || write_to_from.count(a) != 0)
			{
				result.push_back("WAIT");

				Pre();
			}

			write_from_to.insert(make_pair(a, b));
			write_to_from.insert(make_pair(b, a));

			result.push_back(input);
		}

		else if (input[0] == 'R')
		{
			index1 = input.find(" ");

			a = input.substr(index1 + 1, input.size() - (index1 + 1));

			//read with write 조건1
			if (write_to_from.count(a) != 0)
			{
				result.push_back("WAIT");

				Pre();
			}

			read.insert(a);

			result.push_back(input);
		}

	}

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

	return 0;
}