반응형

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

 

2800번: 괄호 제거

첫째 줄에 음이 아닌 정수로 이루어진 수식이 주어진다. 이 수식은 괄호가 올바르게 쳐져있다. 숫자, '+', '*', '-', '/', '(', ')'로만 이루어져 있다. 수식의 길이는 최대 200이고, 괄호 쌍은 적어도 1개

www.acmicpc.net

 

모든 괄호 쌍의 위치를 기억해둔 뒤, 괄호를 제거하는 모든 경우의 문자열을 구해주었습니다.

동일한 문자열은 set을 이용해서 중복을 제거해주었습니다.

 
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <stack>
#include <set>
using namespace std;

string expr;
vector<pair<int, int>> pairs;
vector<string> ans;
set<string> dup;
bool chk[200] = { false };

void init() {
	stack<int> stk;
	for (int i = 0; i < expr.size(); i++) {
		if (expr[i] == '(') {
			stk.push(i);
		}
		else if (expr[i] == ')') {
			pairs.push_back({ stk.top(), i });
			stk.pop();
		}
	}
}

void remove(int idx) {
	if (pairs.size() == idx) {
		string temp = "";
		for (int i = 0; i < expr.size(); i++) {
			if (!chk[i]) {
				temp.push_back(expr[i]);
			}
		}
		dup.insert(temp);
		return;
	}
	remove(idx + 1);
	chk[pairs[idx].first] = chk[pairs[idx].second] = true;
	remove(idx + 1);
	chk[pairs[idx].first] = chk[pairs[idx].second] = false;
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	cin >> expr;
	init();
	remove(0);
	for (auto it = dup.begin(); it != dup.end(); it++) {
		ans.push_back(*it);
	}
	sort(ans.begin(), ans.end());
	for (int i = 1; i < ans.size(); i++) {
		cout << ans[i] << "\n";
	}
}

 

반응형

'Algorithm' 카테고리의 다른 글

백준 2250 : 트리의 높이와 너비  (0) 2021.11.17
백준 2533 : 사회망 서비스(SNS)  (0) 2021.11.17
백준 19238 : 스타트 택시  (0) 2021.11.17
백준 16120 : PPAP  (0) 2021.11.17
백준 7490 : 0 만들기  (0) 2021.11.17

+ Recent posts