[백준/C++] 2504번 괄호의 값

2021. 3. 23. 19:16알고리즘/구현

728x90
반응형

문제: www.acmicpc.net/problem/2504

 

2504번: 괄호의 값

4개의 기호 ‘(’, ‘)’, ‘[’, ‘]’를 이용해서 만들어지는 괄호열 중에서 올바른 괄호열이란 다음과 같이 정의된다. 한 쌍의 괄호로만 이루어진 ‘()’와 ‘[]’는 올바른 괄호열이다.  만일

www.acmicpc.net

 

 

문제풀이

 

스택과 배열을 이용하여 문제를 풀었다.

 

스택의 크기로 괄호가 몇 겹이 있는지 알 수 있고 스택의 크기를 인덱스로 하여 같은 수의 겹에 쌓여있는 수를 모두 더하고 한 겹을 벗어날 때마다 괄호 (, ]에 따라 2나 3을 곱해주었다.

 

( ) -> arr[s.size()] += 2

[ ] -> arr[s.size()] += 3

) ) -> arr[s.size()] += arr[s.size()+1]*2

] ] -> arr[s.size()] += arr[s.size()+1]*3

 

나머지는 에러 처리

 

 

코드

#include <iostream>
#include <stack>

using namespace std;

int main(){
    ios::sync_with_stdio(false); cin.tie(nullptr);

    string str;
    cin>>str;

    int arr[30] = {0,};
    stack<char> s;
    for(int i=0; i<str.length(); i++){
        if(str[i] == '(' || str[i] == '['){
            s.push(str[i]);
        }
        else{ //str[i] == ')' || str[i] == ']'
            if(s.empty()){ //에러처리
                s.push(str[i]);
                break;
            }
            else{
                if(str[i] == ')'){
                    if(s.top() == '('){ //s.top()가 '[' 이면 에러
                        s.pop();
                        if(str[i-1] == '('){
                            arr[s.size()] += 2;
                        }
                        else{
                            arr[s.size()] += arr[s.size()+1]*2;
                            arr[s.size()+1] = 0; //두 번째 괄호 덩어리에서 배열 쓸 수 있으므로 초기화
                        }
                    }
                }
                else if(str[i] == ']'){
                    if(s.top() == '['){//s.top()가 '(' 이면 에러
                            s.pop();
                        if(str[i-1] == '['){
                            arr[s.size()] += 3;
                        }
                        else{
                            arr[s.size()] += arr[s.size()+1]*3;
                            arr[s.size()+1] = 0; //두 번째 괄호 덩어리에서 배열 쓸 수 있으므로 초기화
                        }
                    }
                }
            }
        }
    }

    if(s.empty())
        cout<<arr[0];
    else
        cout<<0;

    return 0;
}

 

 

결과

728x90
반응형

'알고리즘 > 구현' 카테고리의 다른 글

[백준/C++] 4889번 안정적인 문자열  (0) 2021.03.24
[백준/C++] 10799번 쇠막대기  (0) 2021.03.23
[백준/C++] 5430번 AC  (0) 2021.03.22
[백준/C++] 18258번 큐 2  (0) 2021.03.21
[백준/C++] 1021번 회전하는 큐  (0) 2021.03.21