Post List

[BOJ] 백준 2504 괄호의 값

[BOJ] 백준 2504 괄호의 값

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

괄호가 문자열로 주어집니다.
보통의 괄호문제는 괄호의 짝이 만나면 POP 하면 되는 문제 입니다.
이 문제는 거기에 한술 더 떠서 POP 뿐만 아니라 값 계산까지 해야 하는 문제 입니다.

만약 " (()[[]()]) " 괄호를 계산해야 한다고 한다면, 맨 왼쪽부터 스택에 넣겠죠.

( → (( → (2 → (2[ →(2[[ → (2[3 → (2[3( → (2[32 → (2<3+2>*3 → (215 → (17 → 34

이 순으로 계산이 됩니다.
즉, 괄호의 짝을 만날때까지 스택에 있는 것들을 전부 더하고, 그 괄호의 짝에 해당하는 값을 곱해주면 되는 문제 입니다.
그리고 스택의 중간에 숫자가 들어가는 만큼 괄호의 짝이 안맞을때 에러 처리하는 부분을 깔끔하게 처리해주어야 합니다.


소스 코드 :


#include 
#include 
#include 
using namespace std;

int main() {
 string s;
 cin >> s;
 stack st;
 bool error = false;
 for (int i = 0; i < s.length(); i++) {
  if (s[i] == '(' || s[i] == '[') {
   st.push(s[i]);
  }
  else {
   if (s[i] == ')') {
    int tmp = 0;
    if (st.empty()) {
     error = true; break;
    }

    // 괄호쌍 사이의 숫자가 있다면 전부 더함.
    while (st.top() != '(') {
     if (st.top() == ']') {
      error = true; break;
     }
     tmp += st.top();
     st.pop();
     if (st.empty()) {
      error = true; break;
     }
    }
    if (error) break;
    st.pop(); // 마지막 '(' 제거.
    // 괄호쌍 중간에 숫자가 없다면 그냥 2 push, 있다면 전체를 포괄하는 괄호이므로 2를 곱해줌
    tmp == 0 ? st.push(2) : st.push(2 * tmp);
   }
   // ')' 와 동일한 로직.
   else if (s[i] == ']') {
    int tmp = 0;
    if (st.empty()) {
     error = true; break;
    }
    while (st.top() != '[') {
     if (st.top() == '(' || st.empty()) {
      error = true; break;
     }
     tmp += st.top();
     st.pop();
     if (st.empty()) {
      error = true; break;
     }
    }
    if (error) break;
    st.pop(); // 마지막 '[' 제거.
    tmp == 0 ? st.push(3) : st.push(3 * tmp);
   }

  }
  if (isdigit(s[i])) {
   error = true;
   break;
  }
 }
 if (error) cout << '0' << endl;
 else {
  int res = 0;
  while (!st.empty()) {
   if (st.top() != '(' && st.top() != '[') {
    res += st.top();
    st.pop();

   }
   else {
    error = true;
    break;
   }
  }
  if (error) cout << '0' << endl;
  else cout << res << endl;
 }

}

댓글