프로그래머스/2레벨
[프로그래머스/C++] 괄호 변환
Koalitsiya
2024. 3. 10. 20:35
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
> 위를 그대로 구현하면 됨
#include <string>
#include <vector>
#include <stack>
using namespace std;
// 올바른 문자열인지 체크
bool isCorrect(string s) {
stack<char> str;
for(int i = 0; i < s.size(); i++) {
if(!str.empty() && s[i] == ')' && str.top() == '(') str.pop();
else str.push(s[i]);
}
if(str.empty()) return true;
return false;
}
// 괄호 변환
string convert(string s) {
// 빈 문자열이면 빈 문자열 반환
if (s == "") return "";
// 균형잡힌 문자열을 구하기 위해 인덱스를 구함
int idx = 0, cnt = 0;
for(;idx < s.size(); idx++) {
if(s[idx] == '(') cnt++;
else cnt--;
if(cnt == 0) break;
}
// 균형잡힌 문자열
string str1 = s.substr(0, idx + 1);
// 나머지 문자열
string str2 = s.substr(idx + 1);
// str1이 올바른 문자열일 때
if(isCorrect(str1)) return (str1 + convert(str2));
// str2가 올바른 문자열이 아닐 때
else {
// 앞 뒤 제거
str1.erase(str1.begin());
str1.erase(str1.end()-1);
// 괄호 뒤집기
for(int i = 0; i < str1.size(); i++) {
if(str1[i] == '(') str1[i] = ')';
else str1[i] = '(';
}
// 4-1~3과 위에서 만든 올바른 문자열을 리턴
return ("(" + convert(str2) + ")" + str1);
}
}
string solution(string p) {
return convert(p);
}