백준 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;
}