본문 바로가기
프로그래머스

괄호 변환 C++

by paysmile 2020. 11. 2.
#include <string>
#include <vector>
#include <iostream>

using namespace std;

pair<string, string> DevideString(string p) {
	//u,v로 나누기
	int left = 0;
	int right = 0;
	string u, v;
	for (int i = 0; i<p.size(); i++) {
		if (p[i] == '(')
			left++;
		else
			right++;
		if (left == right) {
			u = p.substr(0, i + 1);
			v = p.substr(i + 1, p.size() - i);
			break;
		}
	}
	return make_pair(u, v);
}

bool CheckRightString(string u) {
	//u가 올바른 괄호 문자열인지 확인
	int left = 0;
	int right = 0;
	bool flag = true;
	for (int i = 0; i<u.size(); i++) {
		if (u[0] == ')') {
			flag = false;
			break;
		}
		if (u[i] == '(')
			left++;
		else
			right++;
		if (left<right) {
			flag = false;
			break;
		}
	}
	return flag;
}

string GetAnswer(string p) {
		string answer, u, v;
		
		if (p.size() == 0)
			return p;

		bool flag = true;

		pair<string,string> str = DevideString(p);
		u = str.first;
		v = str.second;
		flag = CheckRightString(u);

		//u가 올바른 괄호 문자열임
		if (flag == true) {
			answer += u;
			p = v;
			answer += GetAnswer(v);
		}
		//u가 올바른 괄호 문자열이 아님
		else {
			answer += '(';
			answer += GetAnswer(v);
			answer += ')';
			if (u.size() > 2)
			{
				u.erase(0, 1);
				u.erase(u.size() - 1, 1);
				for (int i = 0; i < u.size(); i++) {
					if (u[i] == '(')
						answer += ')';
					else
						answer += '(';
				}
			}
		}
		return answer;
}

string solution(string p) {

	return GetAnswer(p);
}

int main(void) {
	string p = "(()())()";
	cout << solution(p) << endl;

	return 0;
}

'프로그래머스' 카테고리의 다른 글

기둥과 보 설치 C++  (0) 2020.11.09
자물쇠와 열쇠 C++  (0) 2020.11.03
완주하지 못한 선수  (0) 2020.10.19
방문 길이 C++  (0) 2019.10.23
스킬트리 C++  (0) 2019.10.23