문제접근

이 문제는 어떤 발상을 떠올리지 못하면 풀지 못하는 문제였다. 

예를 들어 [ [ ] [ ] ] 를 풀면, 3 * ( 3 + 3 ) 가 나오는데, 이 방식을 코딩으로 옮기기가 너무 힘들었다.

그래서 분배법칙을 이용해야 한다. 저 식을, 3 * 3 + 3 * 3 로 바꿀 수 있다. 이를 알고리즘으로 옮기면 된다.

 

[  뒤에 나오는 모든 값이 * 3이 된다

 

[ [  뒤에 나오는 모든 값이 * 3이 된다.

 

[ [ ]  ']'가 나왔으므로, 값을 빼야 한다. ans라는 변수에 지금까지 곱해진 " 3 * 3 " 을 넣는다. 또한, 한 세트가 끝났으므로, 뒤에 나오는 모든 값이 3 * 3 / 3 이 된다.

 

[ [ ] [ 뒤에 나오는 모든 값이 * 3 이 된다.

 

[ [ ] [ ] ']'가 나왔으므로, 값을 빼야 한다. ans라는 변수에 지금까지 곱해진 " 3 * 3 " 을 넣는다. 또한, 한 세트가 끝났으므로, 뒤에 나오는 모든 값이 3 * 3 / 3 이 된다.

 

[ [ ] [ ] ] ']'가 나왔는데, 바로 위에 케이스에서 이미 이 값까지 처리를 해버렸다. 따라서 이 케이스를 통해, 우리는 ' ] ' 가 나와도, 바로 앞에 ' [ ' 가 있어야지 값을 빼야 한다는 것을 알 수 있다. 이 경우까지 처리해서 구현을 해주면 된다.

 

ps. 끝까지 입력을 다 받았는데, [ [ ] 인 경우, 괄호 쌍이 맞지 않는다. 이 부분을 반례로 따로 처리해 주었다.

#include <bits/stdc++.h>
using namespace std;
#define X first
#define Y second

void solve() {
  string str;
  cin >> str;
  stack<char> s;
  int ans = 0;
  int multi = 1;
  bool isValid = true;
  for(int i = 0; i < str.size(); i ++) {
    char c = str[i];
    if(c == '(') {
      s.push(c);
      multi *= 2;
    } else if(c == '[') {
      s.push(c);
      multi *= 3;
    } else if(c == ')') {
        if(s.empty() || s.top() != '(') {
          isValid = false;
          ans = 0;
          break;
        }
        s.pop();
      if(str[i - 1] == '(') {
        ans += multi;
      }
      multi /= 2;
    } else if(c == ']') {
      if(s.empty() || s.top() != '[') {
          isValid = false;
          ans = 0;
          break;
      }
      s.pop();
      if(str[i - 1] == '[') {
        ans += multi;
      }
      multi /= 3;
    }
  }
  if(!s.empty()) ans = 0;
  cout << ans;
}

// ************************************

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

https://www.acmicpc.net/problem/2504

'알고리즘 > 백준' 카테고리의 다른 글

[백준 10799] 쇠막대기 - C++  (0) 2022.04.27
[백준 5430번] AC - C++  (0) 2022.04.24
[백준 2493] 탑 - C++  (1) 2022.04.21
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기