풀이

문제부터 이해해보자.

 

핵심은 스택을 이용해서 원하는 숫자를 만들 수 있는지? 아닌지이다.

input
8 4 3 6 8 7 5 2 1
output
+ + + + - - + + - + + - - - - -

하나씩 차근차근 진행해보면,

 

4를 만들기 위해서는 push 4번, pop 1번

+ + + + Stack [1, 2, 3, 4]

+ + + + - Stack [1, 2, 3]

 

3을 만들기 위해서는 pop 1번

+ + + + - - Stack [1, 2]

 

6을 만들기 위해서는 push 2번, pop 1번

+ + + + - - + + Stack [1, 2, 5, 6]

+ + + + - - + + - Stack [1, 2, 5]

 

8을 만들기 위해서는 push 2번, pop 1번

+ + + + - - + + - + + Stack [1, 2, 5, 7, 8]

+ + + + - - + + - + + - Stack [1, 2, 5, 7]

 

7을 만들기 위해서는 pop 1번

+ + + + - - + + - + + - - Stack [1, 2, 5]

 

5, 2, 1을 각 각 pop 1번씩만 해주면 해결할 수 있다.

따라서 결과는

+ + + + - - + + - + + - - - - -

 

구현은

queue에 현재 만들고자 하는 숫자들을 넣어주고,

현재 만들려고 하는 숫자를 stack의 top과 비교하면서 만들 수 있다면 push 하면서 +를 채워나가고

만들지 못한다면 No를 출력하면 된다.

여기서 만들지 못한다는 것은 현재 queue의 front 값과 stack의 top 부분에서

queue.front() < stack.top() 이면 만들지 못하는 것이다.

 

ret이라는 벡터는 출력을 위한 +, -를 저장하는 공간이다.

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

int n;
stack<int> st;
queue<int> q;
vector<char> ret;
// stack에 push하는 순서는 반드시 오름차순
int main()
{
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		int x;
		cin >> x;
		q.push(x);
	}

	int num = 1;
	bool ok = true;
	while (!q.empty())
	{
		int now = q.front();

		if (!st.empty() && st.top() > now)
		{
			ok = false;
			break;
		}
		if (st.empty())
		{
			st.push(num++);
			ret.push_back('+');
		}
		else
		{
			if (st.top() == now)
			{
				st.pop();
				ret.push_back('-');
				q.pop();
			}
			else
			{
				st.push(num++);
				ret.push_back('+');
			}
		}
	}

	if (ok)
	{
		for (int i = 0; i < ret.size(); i++)
			cout << ret[i] << '\n';
	}
	else
		cout << "NO\n";

	return 0;
}

'Algorithm' 카테고리의 다른 글

[백준 2841] 외계인의 기타 연주 (C++)  (0) 2021.04.10
[백준 10799] 쇠막대기 (C++)  (0) 2021.04.08
[백준 3187] 양치기 꿍 (C++)  (0) 2021.04.05
[백준 2178] 미로 탐색  (0) 2021.04.05
[백준 2606] 바이러스  (0) 2021.04.05

+ Recent posts