개발일지/알고리즘

백준 1874번 : 스택 수열

김진우 개발일지 2025. 1. 25. 20:09

문제를 해석하자면 다음과 같다.

입력은 N와, N개의 수로 이루어진 1~N의 중복 없는 수열을 받는다.

숫자 1부터 N까지 순서대로 스택에 push와 pop을 반복하는데, 이 때 입력받은 수열과 동일한 순서대로 숫자를 pop 하는 과정을 +와 -로 표시하면 된다.

#include <iostream>
#include <stack>
#include <vector>
#include <string>

using namespace std;

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

	int N;
	cin >> N;

	vector<int> nums(N);
	vector<char> answer;
	for (int i = 0; i < N; i++)
	{
		cin >> nums[i];
	}

	stack<int> numStack;
	int lastNum = 0;
	for (int i = 0; i < N; i++)
	{
		if (numStack.empty())
		{
			numStack.push(++lastNum);
			answer.push_back('+');
		}
		int top = numStack.top();
		if (nums[i] == top)
		{
			numStack.pop();
			answer.push_back('-');
			continue;
		}
		else if (top < nums[i])
		{
			if (nums[i] <= lastNum)
			{
				cout << "NO\n";
				return 0;
			}

			while (nums[i] != lastNum)
			{
				numStack.push(++lastNum);
				answer.push_back('+');
			}
			numStack.pop();
			answer.push_back('-');
			continue;
		}
		else
		{
			cout << "NO\n";
			return 0;
		}
	}


	for (char ch : answer)
	{
		cout << ch << "\n";
	}
	return 0;
}