본문 바로가기
Algorithm/C++

[백준 2504] 괄호의 값

by imagineer_jinny 2022. 8. 17.

2504번: 괄호의 값 (acmicpc.net)

 

2504번: 괄호의 값

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

www.acmicpc.net

 

배운 것

괄호만 있는 것이 아니라 숫자도 있어서 새로 stack을 만들어줘야 하나 고민했는데

그럴 필요 없이 sum이랑 num이란 변수를 만들어줘서 push시켜줄 때 num에 곱해줄 숫자 기록하면 됨

 

 

정답 코드

// Authored by : std-freejia
// Co-authored by : BaaaaaaaaaaarkingDog
// http://boj.kr/cbef82389d1048db80c9652d18b71304
#include <bits/stdc++.h>
using namespace std;

stack<char> s;
string str;

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

  cin >> str;
  int sum = 0; // 누적해서 더해질 값
  int num = 1; // 곱해질 값

  for(int i = 0; i < str.size(); i++){
    if(str[i] == '('){
      num *= 2; // 소괄호가 나오면 곱해질 값 2배 증가
      s.push(str[i]);
    }
    else if(str[i] == '['){
      num *= 3; // 대괄호가 나오면 곱해질 값 3배 증가
      s.push(str[i]);
    }
    else if(str[i] == ')'){
      if(s.empty() || s.top() != '('){
        cout << 0;
        return 0;
      }
      if(str[i-1] == '(') sum += num; // 직전 괄호가 여는 괄호였다면 sum에 값 추가
      s.pop();
      num /= 2; // 소괄호 쌍이 사라졌으니 2로 나눔      
    }
    else{ // str[i] == ']'
      if(s.empty() || s.top() != '['){
        cout << 0;
        return 0;
      }
      if(str[i-1] == '[') sum += num; // 직전 괄호가 여는 괄호였다면 sum에 값 추가
      s.pop();
      num /= 3; // 소괄호 쌍이 사라졌으니 2로 나눔
    }
  }
  if(s.empty()) cout << sum;
  else cout << 0;
}

/*
boj 10799 쇠 막대기 문제의 아이디어와 비슷하게 붙어있는 () 혹은 []를 만나면
sum에 점수를 더해줌. () 혹은 []이 몇 점인가는 중첩된 소괄호/대괄호의 곱으로
계산 가능하고 이는 변수 num에 저장이 됨. 
*/

'Algorithm > C++' 카테고리의 다른 글

[백준 4179] 불!  (0) 2022.08.29
[백준 1926] 그림  (0) 2022.08.19
[백준 10799] 쇠막대기  (0) 2022.08.17
[백준 1406번] 에디터  (0) 2022.08.10
[백준 11328번] Strfry  (0) 2022.08.10

댓글