function solution(p) {
if (isCorrect(p)) return p;
const recursion = (str) => {
if (!str) return str;
const [u, v] = splitBalanced(str);
if (isCorrect(u)) return u + recursion(v);
else
return (
'(' +
recursion(v) +
')' +
u.slice(1, -1).replace(/\(|\)/g, (c) => (c === '(' ? ')' : '('))
);
};
return recursion(p);
}
function isCorrect(str) {
const s = [];
for (const c of str) {
if (c === '(') s.push(c);
else s.pop();
}
return s.length ? false : true;
}
function splitBalanced(str) {
let [open, close] = [0, 0];
for (const c of str) {
if (c === '(') ++open;
else ++close;
if (open && open === close) break;
}
const i = open + close;
return [str.slice(0, i), str.slice(i)];
}
알고리즘을 문제에서 자세하게 설명해줘서 그대로 코드를 짜기만 하면 됐다.
문제 이해를 잘못해서 괄호 방향을 뒤집어야 하는데 문자열을 뒤집는 바람에 그거 찾느라 시간이 좀 걸렸다.
정규표현식에서 괄호는 escape가 필요하고, 여러 문자를 각각 치환하려면 |
로 분리를 해주어야 한다.