본문 바로가기

하루하나코딩

백준 1874번 : 스택수열 c++

#include <iostream>
#include <vector>

using namespace std;

int main(){
	
	vector <int> v;
	int n;
	int a;
	int num[100001];
	vector <char> ans;
	
	cin >> n;
	
	for(int i = 0; i< n; i++){
		cin >> num[i];
	}
	
	int cnt = 0;
	
	for(int i = 1; i <= n; i++){
		v.push_back(i);
		ans.push_back('+');
		
		while(!v.empty() && v.back() == num[cnt]){
			v.pop_back();
			ans.push_back('-');
			cnt++;
		}
	}
	
	if(v.empty() == false) cout << "NO";
	else{
		for(int i = 0; i < ans.size(); i++){
			cout << ans[i] << "\n";
		}
	}
	
	return 0;
}

알게된 점

스택 알고리즘이 조금 복잡하긴 했지만 1~n까지를 넣고 수열과 같으면 빼는 식으로 하면 된다.

불가능한경우는 스택이 empty가 아닐경우 출력하면된다.

자꾸 시간초과가 돼서 왠지 살펴봤더니 endl 대신 '\n'을 사용하니까 맞았다.

그래서 endl과 '\n'의 차이를 찾아봤다.

 

버퍼를 비우는 std::endl 이 느리고, 비우지 않는 \n 이 빠르다. 굳이 즉시 출력해 줘야하는 게 아니라면, \n으로 모아뒀다가 출력하는 게 시간을 줄일 수 있다. 버퍼를 비우는 std::endl 이 느리고, 비우지 않는 \n 이 빠르다. 굳이 즉시 출력해 줘야하는 게 아니라면, \n으로 모아뒀다가 출력하는 게 시간을 줄일 수 있다.