알고리즘/문제 풀이

백준 2504 - 괄호의 값(C++)

qqlzzb 2023. 4. 28. 14:47

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

 

2504번: 괄호의 값

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

www.acmicpc.net

 

풀이

스택을 이용하여 풀이한다.

()의 값은 2이고, []의 값은 3이므로 여는 괄호가 나오면 괄호 모양에 따라 각각 스택에 tmp*2 또는 tmp*3을 push 한다.

닫는 괄후가 나오면 여는 괄호와 마찬가지로 tmp/2 또는 tmp/3을 스택에서 pop 한다.

코드

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

int main()
{
    string s;
    cin>>s;
    stack<char> pairst;
    int result = 0, tmp = 1, val = 0;

    int len = s.length();
    for(int i=0; i<len; i++)
    {
        if(s[i]=='(' || s[i]==')') val=2;
        else if(s[i]=='[' || s[i]==']') val=3;
        if(s[i]=='(' || s[i]=='[')
        {
            tmp*=val;
            pairst.push(s[i]);
        }
        else
        {
            if(i==0 || pairst.empty()) 
            {
                result = 0;
                break;
            }
            if((pairst.top()=='(' && s[i]==']') || (pairst.top()=='[' && s[i]==')'))
            {
                result = 0;
                break;
            }
            if(s[i-1]=='('||s[i-1]=='[') result+=tmp;
            tmp/=val;
            pairst.pop();
        }
    }
    if(!pairst.empty()) result = 0; //()[와 같은 경우
    cout<<result;
}

'알고리즘 > 문제 풀이' 카테고리의 다른 글

Problem 1600 - 말이 되고픈 원숭이(C++)  (1) 2023.11.24
백준 9019 - DSLR(C++)  (1) 2023.11.23
백준 11292 - 키 큰 사람(C++)  (0) 2022.12.04
백준 4470 - 줄번호  (0) 2022.11.17
백준 17608 - 막대기(C++)  (0) 2022.11.08