[ ALGORITHM ]/[ 백 준 ]

[BAEKJOON] 1874번 스택 수열

HiStar__ 2020. 7. 24. 19:06

문 제

 

소 스  코 드

#include <iostream>
#include <stack>
#include <vector>

int main() {
	int N;
	std::stack<int> st;
	std::vector<char> v;
	v.reserve(1'000'000);


	std::cin >> N;
	int* seq{ new int[N] };

	for (int i = 0; i < N; ++i) std::cin >> seq[i];

	int cnt{ 1 }, index{ 0 };
	while (true) { 
		if (st.empty() && (N == index)) break;
		else if (!st.empty() && (seq[index] == st.top())) {
			st.pop();
			v.emplace_back('-');
			++index;
		}
		else {
			if (seq[index] < cnt) {
			std::cout << "NO";
			return 0;
			}
			st.push(cnt);
			v.emplace_back('+');
			++cnt;
		}
	}

	for (const auto& a : v) std::cout << a << '\n';


	delete[] seq;
	return 0;
}

 

풀 이

 

  • 1 ~ n 까지 숫자를 원하는 수열 seq[n]으로 만들기 위해서는,
    1 ~ seq[0] 까지 push( )를 하고, stack의 top( )이 seq[0]과 같을 때 pop( )을 해주면 된다. [ 반 복 ]

  • 만약, 스택이 비어있고, 모든 수열을 찾았다면 vector에 저장한  ' - ', ' + '을 저장한 정보를 화면에 출력한다.

  • 만약, seq[n] 의 내부의 값이 cnt를 넘어갈 경우 수열을 만든느 것이 불가능하다.
    seq[5] { 1, 2, 5, 3, 4 } 의 경우 1이 push( ) 하고 pop( )을 하고, 2가 push( ) 하고 pop( )을 한다.
    그리고, {3, 4, 5} 순으로 push가 되는데 5가 pop이 되고, 3 4를 만들어야 하지만, 4 3 순으로 스택에서 나오기 때문에 불가능하다.

 

출 력 값

 

 

문 제  출 처

문제 링크 : [ BAEKJOON ] : https://www.acmicpc.net/problem/1874

 

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