Problem Solving/BOJ

[백준 2504번] [스택] 괄호의 값

  • -
728x90
반응형

스택의 대표적인 문제이다. 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;
}
반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.