Memo
변수 설명
next_stack_val : 스택에 다음으로 들어갈 숫자
PUSH
•
스택의 맨 위에 들어있는 값보다 현재 원하는 값이 작은 경우.
POP
•
스택의 맨 위에 들어있는 값보다 현재 원하는 값이 큰 경우.
막혔던 부분
•
stack.top() 조건을 쓰기 위해서는 stack에 값이 하나라도 있어야 했던 부분.
Code
제출 날짜
@4/3/2021
메모리
3016 KB
시간
20 ms
#include <iostream>
#include <vector>
#include <stack>
#define endl "\n"
std::vector<int> sequence;
std::string ans;
std::stack<int> s;
size_t n;
void input_faster()
{
std::ios_base::sync_with_stdio(false);
std::cin.tie(0);
std::cout.tie(0);
}
void input()
{
input_faster();
std::cin >> n;
sequence.resize(n);
for (size_t i = 0 ; i < n ; i++)
std::cin >> sequence[i];
}
void solve()
{
int val, next_stack_val, ans_size, save;
next_stack_val = 1;
for (size_t i = 0 ; i < n ; i++)
{
val = sequence[i];
if (!s.empty() && s.top() >= val) //pop
{
ans_size = ans.size();
while (val <= s.top())
{
ans+="-";
save = s.top();
s.pop();
if (val == save)
break;
}
if (ans_size == ans.size())
{
ans = "NO";
return ;
}
}
else// push
{
if (val < next_stack_val) // 다음 넣을 수가 원하는 수보다 크면
{
ans = "NO";
return ;
}
if (s.empty())
{
s.push(next_stack_val);
next_stack_val++;
ans+="+";
}
while (val != s.top())
{
ans+="+";
s.push(next_stack_val);
next_stack_val++;
}
ans+="-";
s.pop();
}
}
}
void print_val()
{
if (ans == "NO")
{
std::cout << ans;
return ;
}
for (size_t i = 0 ; i < ans.size() ; i++)
std::cout << ans[i] << endl;
}
int main()
{
input();
solve();
print_val();
return (0);
}
C++
복사