본문 바로가기

Problem Sovling Online Judge/프로그래머스

[프로그래머스/20년 카카오 블라인드] 괄호 변환(Lv.2), C++

괄호 변환(링크)

차분히 주어진 순서대로 구현하면 어렵지 않은 문제. 정수를 증감 시키며 괄호의 균형을 확인하면 편하다.

 

정수 변수를 두고 ( 가 나오면 증가, ) 가 나오면 감소시킨다. 변수가 음수가 된다면 ) 가 먼저 나온 것이므로 올바른 문자열이 아니고, 균형만 확인하고 싶다면 마지막에 0 이 되는지만 확인하면 된다.

 

string solution(string p) {
	if (p.empty()) return p;

	string u = "", v = "";
	int i = 0, c = 0;

	for (i = 0; i < p.size(); ++i) {
		p[i] == '(' ? ++c : --c;
		u += p[i];
		if (c == 0) break;
	}
	v = p.substr(i + 1);

	bool isCorrect = true;
	for (const auto& e: u) {
		e == '(' ? ++c : --c;
		if (c == -1) { isCorrect = false; break; }
	}

	if (isCorrect) return u + solution(v);
	else {
		u.erase(0, 1).erase(u.size() - 1);
		for (auto& e: u) e = (e == '(') ? ')' : '(';
		return '(' + solution(v) + ')' + u;
	}
}