스택의 대표적인 문제이다. vector를 활용해서 풀 수도 있으나, 여러가지 측면때문에 stack 헤더를 활용하여 문제를 접근할 수 있다.
사용할 수 있는 연산은 총 5개이다.
1. push
데이터를 stack에 집어넣는다.
2.pop
맨 위의 데이터를 지운다.
3.size
스택의 크기를 반환한다.
4.empty
비어있는지 확인한다.
5.top
맨 위의 데이터를 반환한다.
단, Stack에서 주의해야할 지점은 pop과 top 연산을 할 때 반드시 stack의 크기가 0이 아닌지를 확인해야 한다.
만약, 크기가 0인데 pop시키거나 top연산을 하게 되면 컴파일 에러가 뜨게 된다.
해당하는 방법으로 코드를 구현하면 다음과 같다.
다만, 이 코드에서는 pop과 top연산을 할 때 그 상황에서의 stack의 크기가 0인지를 확인하지 않고, 반복문을 돌리기 이전에 stack의 크기를 미리 구해놓았기 때문에 컴파일 에러는 절대로 발생하지 않는다.(애초에 한번에 뺄 수 있는게 최대 1개이므로)
#include <iostream>
#include <string>
#include <algorithm>
#include <stack>
#include <vector>
#include <cstring>
using namespace std;
int main(void){
stack <int> data_store;
string input_data;
cin >> input_data;
int size_of_data = input_data.size();
for(int i = 0; i < size_of_data; i++){
if (input_data[i] == '('){
data_store.push(-1);
}
else if (input_data[i] == '['){
data_store.push(-2);
}
else if (input_data[i] == ')'){
int size_of_stack = data_store.size();
int temp = 0;
if (size_of_stack == 0){
cout << "0\n"; // 적절하지 않은 스택
return 0; // 종료
}
for(int i = 0; i < size_of_stack; i++){
if (data_store.top() == -1){
data_store.pop(); // 제외하고 temp만 남겨둔다.
if (temp != 0){
data_store.push(2 * temp);
}
else{
data_store.push(2);
}
break;
}
else if (data_store.top() == -2){
cout << "0\n"; // 적절하지 않은 스택
return 0; // 종료
}
else{
temp += data_store.top();
data_store.pop();
}
}
}
else if (input_data[i] == ']'){
int size_of_stack = data_store.size();
int temp = 0;
if (size_of_stack == 0){
cout << "0\n"; // 적절하지 않은 스택
return 0; // 종료
}
for(int i = 0; i < size_of_stack; i++){
if (data_store.top() == -2){
data_store.pop(); // 제외하고 temp만 남겨둔다.
if (temp != 0){
data_store.push(3 * temp);
}
else{
data_store.push(3);
}
break;
}
else if (data_store.top() == -1){
cout << "0\n"; // 적절하지 않은 스택
return 0; // 종료
}
else{
temp += data_store.top();
data_store.pop();
}
}
}
}
int final_stack_size = data_store.size();
int final_temp_store = 0;
for(int i = 0; i < final_stack_size; i++){
if (data_store.top() == -1 || data_store.top() == -2){
cout << "0\n";
return 0; // 적절하지 않은 스택
}
else{
final_temp_store += data_store.top();
data_store.pop(); // 계속해서 숫자들을 더해나간다. 단, -1이나 -2가 나오면 종료
}
}
cout << final_temp_store << "\n";
return 0;
}