- 입력이 빈 문자열인 경우, 빈 문자열을 반환합니다.
- 문자열 w를 두 "균형잡힌 괄호 문자열" u, v로 분리합니다. 단, u는 "균형잡힌 괄호 문자열"로 더 이상 분리할 수 없어야 하며, v는 빈 문자열이 될 수 있습니다.
- 문자열 u가 "올바른 괄호 문자열" 이라면 문자열 v에 대해 1단계부터 다시 수행합니다.
3-1. 수행한 결과 문자열을 u에 이어 붙인 후 반환합니다.- 문자열 u가 "올바른 괄호 문자열"이 아니라면 아래 과정을 수행합니다.
4-1. 빈 문자열에 첫 번째 문자로 '('를 붙입니다.
4-2. 문자열 v에 대해 1단계부터 재귀적으로 수행한 결과 문자열을 이어 붙입니다.
4-3. ')'를 다시 붙입니다.
4-4. u의 첫 번째와 마지막 문자를 제거하고, 나머지 문자열의 괄호 방향을 뒤집어서 뒤에 붙입니다.
4-5. 생성된 문자열을 반환합니다.
문제를 나누어서 생각하자
- 입력이 빈 문자열의 경우 빈 문자열을 반환
- 두 균형잡힌 문자열을 u,v로 나누기 함수
- 올바른 괄호 문자열인지 아닌지 확인 함수
- 전체 프로세스를 진행할 whole 함수
이렇게 4가지 과정을 만들어서 쓰여진대로 풀자.
// u,v를 나누는 seperate함수
const seperate = (str) =>{
let num1 = 0;
let num2 = 0;
let slice = 0;
let u = "";
let v = "";
for(var i =0; i<str.length; i++){
if(str[i] === '(') num1++
else num2++
if(num1 === num2){
slice= i;
break;
}
}
u = str.substring(0,slice+1);
v = str.substring(slice+1);
return [u,v];
}
//올바른 괄호 문자열인지 체크하는 함수.
const isAll = (str) =>{
let stack = [];
for(var i =0; i<str.length; i++){
if(str[i] === '('){
stack.push(str[i]);
}else{
stack.pop();
}
}
if(stack.length ===0 ) return true;
else return false;
}
const whole = (str) =>{
//입력이 빈 문자열인 경우, 빈 문자열을 반환.
if(str.length == 0){
return "";
}else{
let [u,v] = seperate(str);
if(isAll(u)){
let newStr = whole(v);
return u + newStr
}else{
let newStr ='(';
let str2 = "";
let k = u.substring(1,u.length-1);
let a = whole(v);
//4-1 ~ 4-5작업 수행과정
for(var i =0; i<k.length; i++){
if(k[i] === '('){
str2 +=')'
}else{
str2 +='('
}
}
return newStr + a + ')' + str2;
}
}
}
function solution(p) {
var answer = '';
return answer = (whole(p))
}
처음에는 되게 어렵다고 생각한 문제이다. 하지만, 문제를 따라읽고, 천천히 문제의 주어진 조건으로만 푸니까, 쉽게 해결되었다. 재귀함수 부분을 많이 공부하여서 약간 한번에 풀렸던 문제인 것 같다.