짝이 맞는지 판단하기 위해 string left, string right로 분리해서 개수를 비교해준다.
p.slice(0, i+1)를 현재 u로 잡은 뒤에, u가 올바른 괄호면 그대로 넣으면 되지만,
올바른 괄호가 아니라면 (
와 )
를 가장 처음과 마지막에 넣고, 그 중간에서 재귀를 진행한다.
function solution(p) {
let answer = "";
let sl = (sr = 0); // string left, string right
let flag = false;
// 1. 빈 문자열이면
if (p.length == 0) return "";
for (let i = 0; i < p.length; i++) {
if (p[i] == "(") sl++;
if (p[i] == ")") sr++;
if (sl < sr) flag = true; // 올바른 괄호 X
// 2. 문자열을 u, v로 분리
if (sl == sr) {
// 4. 올바른 괄호가 아니면
if (flag == true) {
answer += "(";
answer += solution(p.slice(i + 1, p.length)); // 나머지(v) 재귀
answer += ")";
// 4-4. 나머지 문자열 괄호 reverse
for (let j = 1; j < i; j++) {
if (p[j] == ")") answer += "(";
if (p[j] == "(") answer += ")";
}
// 4-5. 생성된 문자열 반환
return answer;
}
// 3. 올바른 괄호 문자열이면
else {
answer += p.slice(0, i + 1); // 3-1. 문자열을 이어 붙이고
answer += solution(p.slice(i + 1, p.length)); // 나머지(v) 재귀
return answer;
}
}
}
}