https://programmers.co.kr/learn/courses/30/lessons/60058
function isRight(str) {
const stack=[];
for(let i=0; i<str.length; i++){
if(str[i]==='(') stack.push(str[i]);
else{
if(stack.length===0) return false;
else stack.pop();
}
}
if(stack.length>0) return false;
return true;
}
function solution(p) {
if(p.length===0) return ''; //입력이 빈 문자열일 때
//올바른 괄호 문자열인지 판단 후, 올바르지 않으면(else) 변형해주기
if(isRight(p)) return p;
let start=0, end=0;
let answer='';
for(let i=0; i<p.length; i++){
if(p[i]==='(') start++;
else if(p[i]===')') end++;
if(start===end) {
//u가 올바른 괄호일 때
if(isRight(p.slice(0, i+1))){
answer+=p.slice(0, i+1);
answer+=solution(p.slice(i+1, p.length));
return answer;
}
//u가 올바른 괄호가 아닐 때
else{
answer+='(';
answer+=solution(p.slice(i+1, p.length));
answer+=')';
for(let j=1; j<i; j++){
if(p[j]==='(') answer+=')';
if(p[j]===')') answer+='(';
}
return answer;
}
}
}
}
문제에 나와있는 것과 같이, '재귀함수'를 잘 사용해야하는 문제다. 이런 문제는 아직 낯설어서, 풀다가 중간에 이분의 풀이를 보고 많은 힌트를 얻었다.
알고보니 재밌는 원리의 문제였다.
정답률은 23.1%이다. 문제푸는 방법은 문제에 다 설명되어있지만, 재귀가 어려워서 정답률이 낮은 것 같다.