Baekjoon Review

[Gold 5] 2504 괄호의 값

hanseongbugi 2024. 10. 10. 18:27

https://www.acmicpc.net/problem/2504

 

이 문제는 괄호 검사의 응용 버전이다.

 

괄호를 검사할 때는 스택을 사용한다.

스택의 top과 현재 배열에 있는 요소가 쌍이 맞지 않는다면

옳은 괄호가 되지 않는다.

 

문제에서는 ()인 경우 2의 값으로 대응되도록 하고, []인 경우 3의 값으로 대응되도록 한다.

또한 [x]인 경우 x * 3으로 연산 하며, [x y]인 경우 x * 3 + y * 3으로 연산한다.

 

따라서 괄호가 닫히면 x값을 결정하도록 하면 된다.

이를 위해 temp변수를 지정하였다.

temp변수에 여는 괄호를 만나게 된다면 괄호에 대응되는 값을 곱한다.

그러면 (())인 경우 temp에는 4가 저장될 것이다.

if(str[i] == '('){
     temp *= 2;
     s.push(str[i]);
}
else if(str[i] == '['){
     temp *= 3;
     s.push(str[i]);
}

 

이후 닫는 괄호를 만나면 괄호의 쌍이 맞는지 확인한다.

이는 스택의 top과 현재 괄호가 쌍이 맞는지 확인하면 된다.

그리고, 문자열의 이전 인덱스의 요소와 현재 요소가 서로 괄호의 쌍인 경우

서로 괄호 쌍에 해당하므로 연산을 진행한다.

#include <iostream>
#include <string>
#include <stack>
using namespace std;

int answer = 0;
string str;
stack<char> s;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    
    cin>>str;
    
    int temp = 1;
    for(int i = 0;i<str.size();i++){
        if(str[i] == '('){
            temp *= 2;
            s.push(str[i]);
        }
        else if(str[i] == '['){
            temp *= 3;
            s.push(str[i]);
        }
        
        else if(str[i] == ')'){
            if(s.empty() || s.top() != '('){
                answer = 0;
                break;
            }
            if(str[i - 1] == '('){
                answer += temp;
                temp /= 2;
                s.pop();
            }
            else{
                temp /= 2;
                s.pop();
            }
            
        }
        else if(str[i] == ']'){
            if(s.empty() || s.top() != '['){
                answer = 0;
                break;
            }
            if(str[i - 1] == '['){
                answer += temp;
                temp /= 3;
                s.pop();
            }
            else{
                temp /= 3;
                s.pop();
            }
        }
    }

    if(!s.empty())
        answer = 0;

    cout<<answer;
}