백준 12789 c++

magicdrill·2024년 4월 8일
0

백준 문제풀이

목록 보기
272/654

백준 12789 c++

#include <iostream>
#include <stack>
#include <queue>

using namespace std;

int input(int lower, int upper);
void input_line(queue <int>& line, int size);
void check_result(queue <int> line);

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

	int N;
	queue <int> line;

	N = input(1, 1000);
	input_line(line, N);
	check_result(line);

	return 0;
}

int input(int lower, int upper)
{
	//cout << "input" << endl;
	int A;

	while (1)
	{
		cin >> A;
		if (A >= lower && A <= upper)
		{
			break;
		}
		else
		{
			;
		}
	}

	return A;
}

void input_line(queue <int> &line, int size)
{
	//cout << "input_line" << endl;
	int i;

	for (i = 0; i < size; i++)
	{
		line.push(input(1, size));
	}

	return;
}

void check_result(queue <int> line)
{
	//cout << "check_result" << endl;
	//bool result = true;
	stack <int> wait;
	int count = 1;
	int size = line.size();
	//bool result = true;

	while (count != size+1)
	{
		if (!line.empty())//대기열에 대기자가 있는 경우
		{
			if (line.front() == count)//대기열의 가장 앞 대기자가 순번에 맞는 경우
			{
				line.pop();
				count++;
			}
			else //대기열의 가장 앞 대기자가 순번에 맞지 않는 경우
			{
				if (!wait.empty())//wait에 대기자가 있는 경우
				{
					if (wait.top() == count)//wait에 가장 위 대기자가 순번이 맞는 경우
					{
						wait.pop();
						count++;
					}
					else//wait에 가장 위 대기자가 순번이 다른 경우
					{
						wait.push(line.front());
						line.pop();
					}
				}
				else//wait에 대기자가 없는 경우
				{
					wait.push(line.front());
					line.pop();
				}
			}
		}
		else//대기열에 대기자가 없는 경우
		{
			if (!wait.empty())//wait에 대기자가 있는 경우
			{
				if (wait.top() == count) //wait에 가장 위 대기자가 순번이 맞는 경우
				{
					wait.pop();
					count++;
				}
				else //wait에 가장 위 대기자가 순번이 다른 경우
				{
					//result = false;
					break;//실패
				}
			}
			else//wait에 대기자가 없는 경우
			{
				//result = true;
				break;//안전하게 종료
			}
		}
		//cout << "count : " << count << " 실행중" << endl;
	}

	//if(result == true)
	if (count == size + 1)
	{
		cout << "Nice" << "\n";
	}
	else
	{
		cout << "Sad" << "\n";
	}

	return;
}

0개의 댓글