알고리즘 풀이/백준

[1874] 백준 알고리즘 : 스택 수열(C++)

데롱디롱 2019. 11. 20. 02:25
728x90

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

문제 자체가 이해되지않아, 힘든 문제였다.ㅜㅜ

첫 줄 : 입력 개수(n)
다음 줄 ~ 끝 : 원하는 숫자 순서

스택에 1~n까지 순서대로 숫자가 입력되는데, 이를 처리하여 입력한 순서대로 push(), pop()하면 되는 문제였다.

들어온 숫자가 num, 1~n까지를 t로 제어할때
num > t 이면, 일단 계속 push()
num==t 이면, push()하고 pop()
num < t 이면, num이 이미 스택에 넣어진 숫자라는 뜻이기 때문에
스택의 top()숫자와 같으면 pop() 아니면 더 깊숙히 있는 숫자라 꺼낼 수 없어 NO를 출력하고 끝낸다.
(NO인지 여부는 end로 제어한다.)

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

int main()
{
	int n = 0;
	cin >> n;
	cin.ignore();

	int t = 1;				// 1~n
	int num = 0;			// 입력한 수
	stack<int> st;
	bool end = false;		// 중간에 NO가 나오면 끝내기
	vector<char> result;	// 출력결과 저장

	for (int i = 0; i < n; i++)
	{
		cin >> num;
		while (1)
		{
			if (num > t)
			{
				st.push(t);
				t++;
				result.push_back('+');
			}
			else if (num == t)
			{
				st.push(t);
				t++;
				result.push_back('+');
				st.pop();
				result.push_back('-');
				break;
			}
			else
			{
				if (st.top() == num)
				{
					st.pop();
					result.push_back('-');
				}
				else
				{
					cout << "NO";
					end = true;
				}
				break;
			}
		}
		if (end == true) break;
	}
	if(end == false)
		for (int k = 0; k < result.size(); k++)
		{
			cout << result[k] << "\n";
		}

	return 0;
}

그런데, 처음에 돌렸을때에는 시간초과가 떴었다 ㅜㅜ
검색결과 cout 할 때, endl은 시간을 굉장히 많이 잡아먹는 아이여서 그렇다고 한다.

cout << endl; 대신에 cout << "\n";으로 수정하니까 성공 ^◇^

 

 

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