Algorithm/백준

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

nowkoes 2023. 5. 12. 00:00

문제설명


입출력 예제


개념

 먼저 예제 1에 대해 스택 수열이 어떻게 형성되는지 그림으로 확인해 보자.

 

 

 그림에서 알 수 있듯이, 입력받은 수 n이 기존의 max보다 크다면 max + 1부터 n까지 스택에 수를 푸시한다. 그렇지 않다면, 입력받은 수가 스택에서 뽑을 때까지 pop을 해주면 된다.

 

 반대로 스택 수열을 형성할 수 없는 경우인 예제 2를 보자.

 

 

 3을 입력받는 순간 3을 뽑기 위해서 4를 뽑아야 하는데, 4를 빼면 주어진 수열을 만들 수 없으므로 에러가 뜬다. 즉, 입력받은 수가 num보다 작거나 같은데, 그 수가 스택의 top과 다르다면 주어진 수열을 만들 수 없다.


풀이

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

int main()
{
	ios::sync_with_stdio(false); cin.tie(nullptr);
	int n, num, max = 0;
	cin >> n;
	stack<int> st;
	vector<char> ans;

 문제에서 제시한 테스트 케이스의 개수 n, 입력받을 자연수 num, 최댓값 max를 초기화한다.

 

	while (n--)
	{
		cin >> num;

		if (num > max)
		{
			for (int i = max + 1; i <= num; ++i)
			{
				st.push(i);
				ans.push_back('+');
			}
		}

		else if (st.top() != num)
		{
			cout << "NO";
			return 0;
		}

		st.pop();
		ans.push_back('-');

		if (max < num)
			max = num;
	}

 자연수 num을 입력하고, 이 수가 max보다 크다면 그 수만큼 스택에 문자 '+"를 푸시해 준다. 만약 num <= max인데 스택의 top이 num과 다르다면 수열을 만들 수 없으므로 "NO"를 출력하고 종료한다.

 그 후 스택에서 문자를 하나씩 빼며 '-'를 푸시해준다.

 

	for (auto& val : ans)
		cout << val << '\n';
}

 모든 반복을 끝마치고 나서 ans 스택에서 문자를 하나씩 꺼내 출력한다.

 

총합본

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

int main()
{
	ios::sync_with_stdio(false); cin.tie(nullptr);
	int n, num, max = 0;
	cin >> n;
	stack<int> st;
	vector<char> ans;

	while (n--)
	{
		cin >> num;

		if (num > max)
		{
			for (int i = max + 1; i <= num; ++i)
			{
				st.push(i);
				ans.push_back('+');
			}
		}

		else if (st.top() != num)
		{
			cout << "NO";
			return 0;
		}

		st.pop();
		ans.push_back('-');

		if (max < num)
			max = num;
	}

	for (auto& val : ans)
		cout << val << '\n';
}
반응형

'Algorithm > 백준' 카테고리의 다른 글

[백준] 18258 큐 2 with C++  (2) 2023.05.14
[백준] 2164 카드2 with C++  (0) 2023.05.13
[백준] 4949 균형잡힌 세상 with C++  (0) 2023.05.11
[백준] 9012 괄호 with C++  (0) 2023.05.10
[백준] 10773 제로 with C++  (0) 2023.05.09