본문 바로가기
ㄴ 알고리즘/백준BOJ풀이

[백준 2504번] 괄호의 값 풀이

by 경아ㅏ 2021. 9. 30.

#백준 #백준 2504번 #백준 괄호의 값

 

 

2504번: 괄호의 값

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

www.acmicpc.net

 

중첩되는 괄호에 대해 값을 저장하고 계산하는 문제이다. 괄호의 중첩은 스택을 이용하여 해결할 수 있다. 먼저, 입력된 문자열을 저장하고 스택을 생성한다.

string s;
cin >> s;

stack<string> st;

 

이후, 입력된 문자열의 각 자릿값을 판별하여 처리한다.

(()[[]])([])

 

문자열의 자릿값이 ( 이고 닫는 괄호가 이어지지 않는 경우 스택에 문자열 "(" 을 저장한다.

 

 

//stack
(

 

문자열의 자릿값이 ( 이고 닫는 괄호가 이어지는 경우, 즉 () 인 경우 스택에 () 이 나타내는 값 "2"를 저장한다. 스택이 문자열을 저장하므로 2가 아닌 "2"를 저장해야 한다.

 

 

//stack
( 2

 

문자열의 자릿값이 [ 이고 닫는 괄호가 이어지지 않는 경우, 즉 단독 [ 인 경우 스택에 "[" 를 저장한다.

 

 

//stack
( 2 [

 

문자열의 자릿값이 [ 이고 닫는 괄호가 이어지는 경우, 즉 [] 인 경우 스택에 [] 이 나타내는 값 "3"을 저장한다.

 

 

//stack
( 2 [ 3

 

문자열의 자릿값이 닫는 괄호인 경우, 즉 ) 이거나 ] 일 경우 해당 괄호 단위에 저장된 숫자들을 모두 더해 숫자의 형태로 스택에 저장한다.

 

 

이전까지의 스택에서  ") 의 짝 ("  혹은  "] 의 짝 ["  이 나올 때까지 병렬로 저장된 숫자들을 모두 더한다. 이 케이스의 경우 ] 의 짝 [ 을 찾고, 해당 괄호 단위 안에 있는 숫자를 모두 더한 결과 3이 된다. [ ] 괄호로 쌓여있는 수는 x3배가 되므로 3 * 3 = 9 를 계산하여 스택에 덩어리로 넣는다.

 

//stack
( 2 9

 

이러한 과정을 반복하여 최종 스택을 도출한다.

 

//stack
22 

22 (

22 ( 3

// final stack
22 6

 

최종 스택에 숫자 외의 값이 포함 된 경우 올바른 괄호의 값이 아니었으므로 0을 출력하고 프로그램을 종료시킨다. 숫자들만 포함된 경우 숫자들을 모두 더해 정답을 구한다.

 

#include <iostream>
#include <cstdio>
#include <algorithm> 
#include <cstring>
#include <vector>
#include <cmath>
#include <tuple>
#include <stack>
using namespace std;

bool closeBracket(stack<string>& st, char bracket) {

    string open = (bracket == ']') ? "[" : "(";
    int mult = (bracket == ']') ? 3 : 2;

    int sum = 0;
    while (!st.empty() && st.top() != "(" && st.top() != "[") {
        sum+=stoi(st.top());
        st.pop();
    }

    if (st.empty() || st.top() != open) {
        printf("0");
        return false;
    }
    st.pop();
    st.push(to_string(sum*mult));
    return true ;
}

int getAnswer(stack<string> &st) {

    int re = 0;
    while (!st.empty()) {
        if (st.top() == "(" || st.top() == "[") return 0;
        re+=stoi(st.top());
        st.pop();
    }
    return re;
}

int main() {

    string s;
    cin >> s;

    stack<string> st;
    for (int i=0; i<s.size(); i++) {

        if (s.substr(i, 2) == "()") {
            st.push("2");
            i++;
        }
        else if (s.substr(i, 2) == "[]") {
            st.push("3");
            i++;
        }
        else if (s[i] == '(') st.push("(");
        else if (s[i] == '[') st.push("[");
        else if (s[i] == ']' || s[i] == ')')
            if (!closeBracket(st, s[i])) return 0;
    }
    printf("%d", getAnswer(st));
    return 0;
}

 

댓글