알고리즘

[C++] 백준 1874번 스택 수열

J3SUNG 2019. 9. 5. 03:52
728x90

스택 문제입니다.

스택의 push와 pop을 이용해서 입력된 배열의 모양을 만들 수 있는지 찾아야합니다.
stack에 쌓이는 수는 1부터 n까지 차례대로 쌓입니다.  (1부터 n = num)

비어있거나, top()이 현재 찾는 수와 다르면
num을 push해줍니다.

top()이 찾는 수와 같으면 pop()을 해줍니다.

num이 n보다 커지면  만들 수 없는 배열이 됩니다.

#include <iostream>
#include <cstring>
#include <stack>
#include <vector>
#include <algorithm>
using namespace std;

int n;
int arr[100010];
stack<int> s;
vector<char> v;
int num;

int main(int argc, char *argv[])
{
	num = 1;

	scanf("%d", &n);

	for (int i = 0; i < n; ++i) {
		scanf(" %d", &arr[i]);
	}

	for (int i = 0; i < n; ++i) {
		if (s.empty() || s.top() != arr[i]) {
			while (1) {
				if (num > n) {
					puts("NO"); 
					return 0;
				}

				s.push(num++);
				v.push_back('+');
				if (s.top() == arr[i]) {
					s.pop();
					v.push_back('-'); 
					break;
				}
			}
		}
		else if (s.top() == arr[i]) {
			s.pop(); 
			v.push_back('-');
		}
	}

	for (int i = 0; i < v.size(); i++) {
		printf("%c\n", v[i]);
	}

	return 0;
}