Post

baekjoon 2800:괄호 제거

baekjoon 2800 괄호 제거

2800번 괄호 제거

접근

괄호를 제거할 때 여는 괄호와 닫는 괄호 쌍을 맞추는게 중요한데 이 작업은 stack을 이용해서 했다.
그리고 이진수를 이용해서 어느 괄호를 지울지 경우의 수 생성을 했고 지울 괄호는 N으로 표시했다가 마지막에
N이면 무시하게 해서 괄호를 지웠다. 이번에도 map에 넣어서 자동 정렬시켰다.

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
//2800
#include <iostream>
#include <vector>
#include <map>
#include <stack>
using namespace std;
int main(){
  ios::sync_with_stdio(false);
  cin.tie(0); cout.tie(0);

  string s;
  cin >> s;
  vector<char> v;
  map<string, int> ans;
  int count = 0;
  vector<pair<int, int>> brace;
  stack<int> st;
  for(int i = 0; i < s.size(); i++){
    v.push_back(s[i]);
    if(s[i] == '('){
      count++;
      st.push(i);
    }
    else if(s[i] == ')'){
      brace.push_back({st.top(), i});
      st.pop();
    }
  }
  int ansCount = (1 << count) - 2;
  for(int i = 0; i <= ansCount; i++){
    vector<char> temp;
    temp = v;
    for(int j = 0; j < count; j++){
      if(!(i & (1 << j))){
        temp[brace[j].first] = 'N';
        temp[brace[j].second] = 'N';
      }
    }
    string tempStr = "";
    for(auto i : temp){
      if(i != 'N'){
        tempStr += i;
      }
    }
    ans[tempStr] = 0;
  }
  for(auto i : ans){
    cout << i.first << "\n";
  }
  //2*10-2 11111 11111 no
  //1022 ~ 0 1023

  return 0;
}

배운 점

괄호나오면 stack 자주 쓴다. (저번에 후위표기식postfix 할 때도 그랬다.)

This post is licensed under CC BY 4.0 by the author.