Search
Duplicate

스택 수열

주차
14
문제번호
1874
언어
C++
티어
실버
유형
자료구조
nj_Blog
nj_상태
이해도
풀이
사람
이해도 2
13 more properties

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++
복사