GitHubSeob
C++ / 백준 / 2800 / 괄호 제거 본문
문제
https://www.acmicpc.net/problem/2800
2800번: 괄호 제거
첫째 줄에 음이 아닌 정수로 이루어진 수식이 주어진다. 이 수식은 괄호가 올바르게 쳐져있다. 숫자, '+', '*', '-', '/', '(', ')'로만 이루어져 있다. 수식의 길이는 최대 200이고, 괄호 쌍은 적어도 1개
www.acmicpc.net
문제풀이
큰 틀은 DFS이다.
stack<pair<int, int>>bracket은 괄호 '('와 해당 위치를 저장하기 위한 용도,
set<string>answer는 중복 제거된 값들을 저장하는 용도,
string input은 입력값,
vector<bool>remove는 True값이면 괄호를 지운다는 의미, False이면 지우지 않는다는 의미를 나타내는 용도이다.
0번째 인덱스부터 DFS를 시작한다.
스택을 이용하여 '(' 발견 시 bracket.first에 ( 입력, bracket.second에는 몇 번째 인덱스인지 값을 저장한다.
')'발견 시 (의 위치를 num에 저장하고 pop을 한다.
그다음 방금 발견한 괄호 한쌍을 지우지 않고 넘어가는 DFS문을,
지우고 넘어가기 위해 remove[num]과 remove[idx]의 값을 True로 바꾸고 DFS문 실행한다.
현재 값이 괄호가 아닌 나머지 값이면 idx+1을 하고 DFS문을 실행한다 (다음칸으로 이동).
idx가 input.size와 같다면 문자열을 다 방문했으므로 remove값에 따라 string 값을 만들고 answer에 집어넣는다.
모든 DFS문이 종료되면 첫 번째 answer(입력값과 동일)을 제외하고 모두 출력한다.
코드
#include <iostream>
#include <stack>
#include <vector>
#include <algorithm>
#include <set>
using namespace std;
string input;
set<string>answer;
void DFS(int idx, vector<bool>remove, stack<pair<char, int>>bracket) {
if (idx == input.size()) {
string ans("");
for (int idx2 = 0; idx2 < input.size(); ++idx2) {
if (!remove[idx2])
ans += input[idx2];
}
answer.insert(ans);
}
else if (input[idx] == '(') {
bracket.push({ '(',idx });
DFS(idx + 1, remove, bracket);
}
else if (input[idx] == ')') {
int num = bracket.top().second;
bracket.pop();
DFS(idx + 1, remove, bracket);
remove[num] = true;
remove[idx] = true;
DFS(idx + 1, remove, bracket);
}
else {
DFS(idx + 1, remove, bracket);
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cin >> input;
vector<bool>remove(input.size(), false);
stack<pair<char, int>>bracket;
DFS(0, remove, bracket);
set<string>::iterator iter;
iter = answer.begin();
iter++;
for (iter; iter != answer.end(); iter++)
cout << *iter << '\n';
}
'Baekjoon > Gold' 카테고리의 다른 글
C++ / 백준 / 1918 / 후위 표기식 (0) | 2022.03.21 |
---|---|
C++ / 백준 / 2493 / 탑 (0) | 2022.03.18 |
C++ / 백준 / 22942 / 데이터 체커 (0) | 2022.03.14 |
C++ / 백준 / 1039 / 교환 (0) | 2022.01.30 |
C++ / 백준 / 16397 / 탈출 (0) | 2022.01.24 |