[백준/BOJ] 백준 22234번 : 가희와 은행

2022. 2. 2. 17:47알고리즘 문제풀이

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

 

22234번: 가희와 은행

가희는 창구가 하나인 은행을 운영하고 있습니다. 가희의 은행이 영업을 시작했을 때, 대기 줄에는 손님이 N명 있습니다. [그림 1] 카운터 직원과 N명의 손님 x번 손님에 대한 정보는 x번 손님의

www.acmicpc.net

deque를 이용해서 시뮬레이션을 통해 문제를 해결했다

 

코드

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

int n, t, w;
int m;
deque<pair<int, int>> people;
deque<tuple<int, int, int>> input_people;
vector<int> result;

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

	cin >> n >> t >> w;

	for (int i = 0; i < n; i++)
	{
		int px, tx;
		cin >> px >> tx;

		people.push_back(make_pair(px, tx));
	}

	cin >> m;

	for (int i = 0; i < m; i++)
	{
		int px, tx, cx;
		cin >> px >> tx >> cx;

		input_people.push_back(make_tuple(cx, px, tx));
	}

	//들어오는 순서가 작은 순서로 정렬
	sort(input_people.begin(), input_people.end());

	int here_time = 0;
	bool finish = false;

	while (1)
	{
		//here_time에 들어오는 손님이 있는지 확인
		if (input_people.size() != 0 && get<0>(input_people.front()) == here_time)
		{
			people.push_back(make_pair(get<1>(input_people.front()), get<2>(input_people.front())));
			input_people.pop_front();
		}

		//앞에 손님 처리
		int people_id = get<0>(people.front());
		int people_remain = get<1>(people.front());

		//t초안에 해당 작업을 모두 처리할 수 있을때
		if (people_remain <= t)
		{
			//남은 시간동안 처리한다
			for (int i = 1; i <= people_remain; i++)
			{
				result.push_back(people_id);

				here_time++;

				//here_time에 들어오는 손님이 있는지 확인
				if (input_people.size() != 0 && get<0>(input_people.front()) == here_time)
				{
					people.push_back(make_pair(get<1>(input_people.front()), get<2>(input_people.front())));
					input_people.pop_front();
				}

				if (here_time >= w)
				{
					finish = true;
					break;
				}
			}

			//처리한거 뺴기
			people.pop_front();
		}

		//t초안에 해당 작업을 모두 처리할 수 없을때
		else
		{
			//t초 동안만 처리한다
			for (int i = 1; i <= t; i++)
			{
				result.push_back(people_id);

				here_time++;

				//here_time에 들어오는 손님이 있는지 확인
				if (input_people.size() != 0 && get<0>(input_people.front()) == here_time)
				{
					people.push_back(make_pair(get<1>(input_people.front()), get<2>(input_people.front())));
					input_people.pop_front();
				}

				if (here_time >= w)
				{
					finish = true;
					break;
				}

			}

			//남은만큼 다시 맨 뒤로 넣기
			people.pop_front();
			people.push_back(make_pair(people_id, people_remain - t));
		}

		if (finish == true)
			break;
	}

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

	return 0;
}