득이공간

[백준 C++] 1874 스택 수열 - 자료구조 본문

PS/알고리즘 문제풀이

[백준 C++] 1874 스택 수열 - 자료구조

쟁득 2024. 1. 20. 17:00
 

1874번: 스택 수열

1부터 n까지에 수에 대해 차례로 [push, push, push, push, pop, pop, push, push, pop, push, push, pop, pop, pop, pop, pop] 연산을 수행하면 수열 [4, 3, 6, 8, 7, 5, 2, 1]을 얻을 수 있다.

www.acmicpc.net

 

#include <iostream>
#include <vector>
#include <stack>
#include <queue>
using namespace std;

int main()
{
	bool possible = true;

	int n = 0;
	cin >> n;

	vector<int> sequence;
	sequence.reserve(n);
	for (int i = 0; i < n; ++i)
	{
		int inputNumber = 0;
		cin >> inputNumber;
		sequence.emplace_back(inputNumber);
	}

	stack<int> outputStack;
	for (int i = n; i > 0; --i)
	{
		outputStack.push(i);
	}

	queue<bool> result;
	stack<int> inputStack;
	for (int i = 0; i < n; ++i)
	{
		while ((inputStack.empty() || inputStack.top() < sequence[i])
			&& !outputStack.empty())
		{
			inputStack.push(outputStack.top());
			outputStack.pop();
			result.push(true);
		}

		if (inputStack.top() == sequence[i])
		{
			inputStack.pop();
			result.push(false);
			continue;
		}
		else
		{
			possible = false;
			break;
		}
	}

	if (!possible)
	{
		cout << "NO\n";
		return 0;
	}

	while (!result.empty())
	{
		if (result.front())
		{
			cout << "+\n";
		}
		else
		{
			cout << "-\n";
		}
		result.pop();
	}
}

 

sequence: 입력받은 수열을 담는 벡터입니다.

outputStack: 스택에 채워넣을 숫자 1부터 n까지를 보관하는 스택입니다.

inputStack: 문제에서 제시한 오름차순으로 숫자를 채워넣기위한 스택입니다.

result: 수열 생성이 불가능한 경우에 "NO" 메시지만 출력해야하기 때문에 프린트할 문자 +, -를 큐에 저장해 놓습니다.