✏️ Algorithm/알고리즘 풀이

2504번 괄호의 값 - C++

미미누 2022. 7. 27. 19:27

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

2504번: 괄호의 값

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

www.acmicpc.net


[풀이]
스택의 괄호 활용 문제이다.
구현이 까다로운 문제이자 생각이 상당히 힘들었다.
총합인 sum과 누적 값인 num을 선언한다.
( [ 기호가 들어오면 각각 num에 2와 3을 곱해주고,
닫는 괄호인 ) ]이 들어오면, 배열의 이전 idx값이 ([ 이라면 num에 sum을 더해주고, idx값이 ([이 아니라면 단순히 pop() 연산과 나누기 연산을 해주면 된다.

[코드]

#include <bits/stdc++.h>
using namespace std;

int main() {
   ios::sync_with_stdio(0);
   cin.tie(0);
   
   string s;
   cin >> s;
   
   stack<char> S;
   int t=0;
   int sum = 0;
   int num = 1;
   for(int i=0; i<s.size(); i++){
      if(s[i] == '(') {
          S.push(s[i]);
          num *=2;
      }
      else if(s[i] == '['){
          S.push(s[i]);
          num*=3;
      }
      else if(s[i] == ')'){
       if(S.empty() || S.top() != '('){
           cout << 0;
           return 0;
       }
       else{
           if(s[i-1] == S.top()){
               sum+=num;
           }
       
           S.pop();
           num/=2;
       }
      }
      else if(s[i] == ']'){
          if(S.empty() || S.top() != '['){
              cout << 0;
              return 0;
          }
          else{
             if(s[i-1] == S.top()){
                 sum+=num;
             }
             S.pop();
             num/=3;
          }
      }
   }
   if(!S.empty()){
     cout << 0;
     return 0;
   } 
   cout << sum;
}

'✏️ Algorithm > 알고리즘 풀이' 카테고리의 다른 글

7576번 토마토 - C++  (0) 2022.07.29
4179번 불! - C++  (0) 2022.07.29
1926번 그림 - C++  (0) 2022.07.27
5430번 AC - C++  (0) 2022.07.26
1021번 회전하는 큐 - C++  (0) 2022.07.26