반응형
Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
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
Archives
Today
Total
관리 메뉴

코딩하기 좋은날

백준 2800 괄호 제거 본문

백준(Baekjoon) 문제

백준 2800 괄호 제거

huiung 2019. 1. 21. 23:23
반응형

문제와 채점은 위 사이트에서 확인 하실 수 있습니다.

 

이 문제는 괄호쌍이 위치해 있는 인덱스를 저장 한 후 함수의 재귀 호출로 해결을 하여야 합니다. 

 

'('을 만났을 경우 그 짝인 괄호를 지우는 경우와 지우지 않는 경우로 나누어서 진행 하면 해당 하는 모든 경우를 구할 수가 있습니다.

 

즉 입력받은 문자열을 비어있는 문자열에 처음부터 더해가며 '('가 나왔을 경우 이 괄호를 제거하고 가는 경우, 그렇지 않은 경우를 재귀적 호출로 모두 구해낼수가 있습니다.

 

계속 시간 초과가 나서 다른분들 풀이를 참고하여 풀었는데 재귀 함수는 역시 어려운것 같습니다..

 

#include <iostream>
#include <stack>
#include <string>
#include <set>


using namespace std;

set<string> se; //가능한 경우를 저장할 set 
stack<char> s;
int index[200]; //괄호 쌍의 인덱스를 저장 
string ret;
bool erase[200]; // 괄호를 지울지 말지를 결정 

void deletefunc(int cur, int len, string str) {
	
	if(cur == len) {
		se.insert(ret);
		return;
	}
	
	if(str[cur] == '(') {
		erase[index[cur]] = true; //괄호를 지우는 경우 
		deletefunc(cur+1, len, str);
		erase[index[cur]] = false; //괄호를 지우지 않는 경우 
	}
	
	if(str[cur] == ')' && erase[cur]) {
		deletefunc(cur+1, len, str);
	} 
	
	else {
		ret += str[cur];
		deletefunc(cur+1, len, str);
		ret.resize(ret.size()-1); // 더해준 만큼 감소시킴 
	}
}

int main(void) {
	ios_base::sync_with_stdio(false); cin.tie(NULL);
	string str;
	cin >> str;
	int len = str.length();

	for(int i = 0; i < len; i++) { //스택에 '('가 나올시 인덱스를 저장 
		if(str[i] == '(') {
			s.push(i);
		}

		else if(str[i] == ')') { //')'가 나올경우  index[i]에 '('가 있는 인덱스를 저장 
			index[i] = s.top();
			index[s.top()] = i; //괄호 쌍을 서로 매칭 시켜줌  ex) 1,3번째에 '(' ')' 가 있다면 index[1] = 3, index[3] = 1 과 같은식 
			s.pop();
		}
	}

	deletefunc(0, len, str);

	se.erase(str);
	
	for(auto n: se)
		cout<<n<<'\n';

	return 0;
}
반응형

'백준(Baekjoon) 문제' 카테고리의 다른 글

백준 1929 소수 구하기(에라토스테네스의 체)  (0) 2019.01.22
백준 2108 통계학  (0) 2019.01.22
백준 1092 배  (0) 2019.01.21
백준 2399 거리의 차이  (0) 2019.01.20
백준 3047 ABC  (0) 2019.01.20