boj 2504 c++ 괄호의 값

백준 2504 cpp 괄호의 값

 

아이디어

  1. line을 받는다.
  2. temp = 1, ans = 0, bool iserror = false 을 선언한다.
  3. line[i] 가 ( 이거나 [ 일 때에는 temp에 2 or 3 을 곱하고, 스택에 넣는다.
  4. line[i]) or ] 일 때에는 temp를 2 or 3으로 나눈다. 또, 스택에서 하나를 뺀다.
  5. ans 에 temp 를 추가하는 시점은 line[i-1] 이 닫히는 괄호와 짝을 이룰 때이다.
  6. ) or ] 을 만났는데 스택이 비었거나 스택의 맨 위에 짝이 맞지 않는 경우 iserror=true 해주고 break 한다.
  7. (()()() 같은 경우를 대비해 for문을 빠져 나왔을 때에도 Stack이 비었는지 확인해준다.
  8. ans를 출력한다.

 

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

string line;
stack<char> S;

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

    cin >> line;

    int temp = 1;
    int ans = 0;
    bool iserror = false;

    for (int i = 0; i < line.size(); i++)
    {
        char c = line[i];
        if (c == '(')
        {
            temp *= 2;
            S.push(c);
        }
        else if (c == '[')
        {
            temp *= 3;
            S.push(c);
        }
        else if (c == ')')
        {
            if (S.empty() || S.top() != '(')
            {
                iserror = true;
                break;
            }
            else
            {
                if (line[i-1] == '(')
                    ans += temp;
                temp /= 2;
                S.pop();
            }
        }
        else // (c == ']')
        {
            if (S.empty() || S.top() != '[')
            {
                iserror = true;
                break;
            }
            else
            {
                if (line[i-1] == '[')
                    ans += temp;
                temp /= 3;
                S.pop();
            }
        }
    }

    if (iserror == true || !S.empty())
        cout << 0;
    else
        cout << ans;
}

 

'Algorithm' 카테고리의 다른 글

boj 4889 c++ 안정적인 문자열  (0) 2020.09.04
boj 9012 c++ 괄호  (0) 2020.09.03
boj 10799 c++ 쇠막대기  (0) 2020.08.31
BOJ 1021 c++ 회전하는 큐  (0) 2020.08.29
BOJ 2164 c++ 카드 2  (0) 2020.08.26
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기
// custom