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
이런 과정을 입력받은 숫자의 갯수대로 8번 반복
여기서 정답배열의 -갯수와 n의 값을 비교해 같다면 정답배열을 출력하고
같지 않다면 연산가능한 배열이 아니기 때문에 NO 를 출력
#include <iostream>
#include <stack>
#include <vector>
using namespace std;
int main() {
int n, m, j=1, count=0;
vector <int> v; // 입력받을 수열
vector <char> answer; // 정답출력할 배열(+ -)
stack<int> s;
cin >> n;
for (int i = 0; i < n; i++) { //수열 입력
cin >> m;
v.push_back(m);
}
for (int i = 0; i < n; i++) {
if ((s.empty() == false) && (s.top() == v.at(i))) { // 스택에 값 추가 전 pop 하는 경우
answer.push_back('-'); //정답배열에 - 저장
s.pop();
}
else { // 빼내야할 수열까지 스택에 차례대로 집어넣음
for (j; j <= v[i]; j++) {// 오름차순으로 push해야 하기 때문에 j는 v[i]값으로 증가
s.push(j);
answer.push_back('+');
}
}
if ((s.empty() == false) && (s.top() == v.at(i))) { // 위 pop 하는 if문과 같음
answer.push_back('-'); // 스택에 값 추가 후 pop 하는 경우
s.pop();
}
}
for (int i = 0; i < answer.size(); i++) { // - 갯수 카운트
if (answer[i] == '-')
count++;
}
if (count == n) { //- 갯수가 n개일 경우
for (int i = 0; i < answer.size(); i++)
cout << answer[i] << "\n"; //정답출력
}
else // - 갯수가 n개가 아닌경우(연산불가)
cout << "NO\n"; // NO 출력
return 0;
}
'백준' 카테고리의 다른 글
백준_1816: 암호 키 (0) | 2021.01.13 |
---|---|
백준_9012: 괄호 (0) | 2021.01.11 |
백준_1003: 피보나치 함수 (1) | 2021.01.01 |
백준_10845: 큐 (0) | 2020.12.27 |
백준_3986: 좋은단어 (1) | 2020.12.26 |