백준 2504 괄호의 값 / C++

이유참치·2025년 12월 15일

백준

목록 보기
76/249

문제 : 링크텍스트

풀이 point

괄호 안에 괄호가 있다면 값을 곱해주는 형태로 계산이 되는데
(()[[]]) 이 경우 안의 괄호 ()[[]]는 2+3x3 총 (()[[]]) 이 괄호는 2x(2+3x3) 형태로 계산된다. 이 수식을 분배법칙을 활용하여 2x2 + 2x3x3으로 바꿀 수 있다.

풀이 순서

  1. 입력 처리
  2. 열린괄호 일때는 스택에 push
    2-1. ( 일 때는 임의 변수에 x2, [ 일때는 임의 변수에 x3
  3. 닫힌괄호를 만났을 때 제대로 된 괄호 짝인지 확인 해야함
    (문제에서 괄호 짝이 맞지 않을 경우 0을 출력하라 함)
  4. 제대로 된 괄호일 경우 임의 변수에 저장된 값을 답 변수에 덧셈 해줌
    4-1. 그 후 임의 변수 값은 /2 or /3을 통해 다시 값을 변경해줌(이미 짝이 해결된 것이기 때문) and pop()을 통해 괄호 짝 삭제

코드

#include <iostream>
#include <vector>
#include <queue>
#include <stack>
//분배법칙 활용


//백준 2504, 괄호의 값
int main(){
    
    std::string s;
    std::stack<char> stack;
    int tmp{1};
    int ans{0};

    std::cin >> s;
    
    for(int i{0}; i<s.size(); ++i){
        if(s[i] == '(') {
            stack.push('(');
            tmp*=2;
        }
        else if(s[i] == '['){
            stack.push('[');
            tmp *= 3;
        }
        else if(s[i] == ')'){ //닫힌 괄호를 만났을 때
            if(stack.empty() || stack.top() != '('){
                std::cout << 0;
                return 0;
            }
            else if(s[i-1] == '(') ans += tmp;
            stack.pop();
            tmp /= 2;
            
        }
        else if(s[i] == ']'){
            if(stack.empty() || stack.top() != '['){
                std::cout << 0;
                return 0;
            }
            else if(s[i-1] == '[') ans += tmp;
            tmp/=3;
            stack.pop();
        }
    }
    if(!stack.empty()) ans=0;
    std::cout << ans;

    return 0;
}
profile
임아리 - 대학생

0개의 댓글