※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 2800번 문제인 괄호 제거이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/2800
2800번: 괄호 제거
첫째 줄에 음이 아닌 정수로 이루어진 수식이 주어진다. 이 수식은 괄호가 올바르게 쳐져있다. 숫자, '+', '*', '-', '/', '(', ')'로만 이루어져 있다. 수식의 길이는 최대 200이고, 괄호 쌍은 적어도 1개
www.acmicpc.net
이 문제는 주어진 수식 문자열에서 짝이 맞는 괄호들을 일부 제거한 문자열들을 사전순으로 출력하는 문제이다.
문자열을 둘러보며 짝이 맞는 괄호쌍의 위치를 스택을 이용하여 구해주고, 이 쌍들을 각각 포함하는 경우와 포함하지 않는 경우를 전부 탐색하여 한 벡터에 담은 뒤 정렬하는 것으로 문제를 해결할 수 있다.
식 하나를 여러 쌍의 괄호가 감쌀 경우 위와 같이 처리한 경우 중복되는 수식이 나온다는 점을 유의하여 구현하자. 예를 들면 ((((1+2))))와 같은 수식의 처리에 유의하자.
아래는 제출한 소스코드이다.
#include <iostream>
#include <vector>
#include <string>
#include <stack>
#include <algorithm>
using namespace std;
int arr[201];
int P, slen;
vector<pair<int, int>> p_pair;
string s;
vector<string> ans;
void func(int N) {
if (N == P) {
string ret = "";
for (int i = 0; i < slen; i++) {
if (arr[i]) continue;
ret += s[i];
}
ans.emplace_back(ret);
}
else {
int x = p_pair[N].first, y = p_pair[N].second;
arr[x] = arr[y] = 1;
func(N + 1);
arr[x] = arr[y] = 0;
func(N + 1);
}
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
stack<int> stk;
cin >> s;
slen = s.length();
for (int i = 0; i < slen; i++) {
if (s[i] == '(') stk.push(i);
else if (s[i] == ')') {
p_pair.push_back({ stk.top(),i });
stk.pop();
}
}
P = p_pair.size();
func(0);
sort(ans.begin(), ans.end());
int len = ans.size();
for (int i = 1; i < len; i++) {
if (ans[i] == ans[i - 1]) continue;
cout << ans[i] << '\n';
}
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 8112 // C++] 0과 1 - 2 (0) | 2021.10.12 |
---|---|
[BOJ 8111 // C++] 0과 1 (0) | 2021.10.11 |
[BOJ 1595 // C++] 북쪽나라의 도로 (0) | 2021.10.09 |
[BOJ 5913 // C++] 준규와 사과 (0) | 2021.10.08 |
[BOJ 11062 // C++] 카드 게임 (0) | 2021.10.07 |