알고리즘

BOJ [1874] 스택 수열

감동이중요해 2017. 8. 10. 18:34

https://www.acmicpc.net/problem/1874


스택 문제에서 조금 더 꼬아본 문제.

풀 때는 오래걸렸는데 스택의 기본 개념을 고려하면 쉽게 풀 수 있던 문제였다.

불가능한 경우는 입력값(pop했을 때의 값)이 stack[top]과 다른 경우가 되겠다.

push와 pop이 각 n번씩 수행되고 n번 입력하므로 O(3n) = O(n)으로 풀 수 있다.

stack용 배열 하나와 예제 출력에 불가능한 경우 NO, 가능한 경우에만 +, -로 표현하도록 되어 있으니 출력용 배열을 하나 더 만들었다.


#include <cstdio>

int stack[100000] = { 0 };
char out[200000] = { 0 };

int main()
{
	int n, in = 0, stTop = 0, outTop = 0;
    // in = 스택에 삽입할 자연수(1부터 차례대로)
	scanf("%d", &n);
	for (int i = 0; i < n; i++)
	{
		int num;
		scanf("%d", &num);

        // 받는 값은 n값 이상이 될 수 없다.
		if (num > n)
		{
			printf("NO\n");
			return 0;
		}

        // 스택에 삽입할 자연수가 num보다 낮으면 push
        // push는 최대 n번까지 수행한다.
		if (in < num)
		{
			for (int j = in; j < num; j++)
			{
				stack[stTop++] = ++in;
				out[outTop++] = '+';
			}
		}

        // 스택에 num값과 같을 때까지 자연수를 삽입하면 pop을 수행한다.
		if (num == stack[stTop - 1])
		{
			stack[--stTop] = 0;
			out[outTop++] = '-';
		}
        // num값과 stack[stTop]이 다르면 잘못된 경우이다.
		else
		{
			printf("NO\n");
			return 0;
		}
	}

    // 저장했던 +, -를 전부 출력한다.
	for (int i = 0; i < outTop; i++)
		printf("%c\n", out[i]);

	return 0;
}