카테고리 없음
[프로그래머스/javascript] 괄호변환
_서리__
2023. 3. 29. 18:08
풀이방법
우선 균형잡힌 문자열이맞는지 확인하는 코드와 올바른 문자열이 맞는지 확인하는 펑션을 작성하였습니다.
이후 올바른 문자열이 맞다면 그대로 p를 반환하고
아닐경우 u와 v로 나뉘게 됩니다.
새로운 u(newP)가 올바른 문자열이 맞다면 u+solution(v)를 반환합니다.
그렇지 않다면, 문제에 적힌대로 뒤집고 어쩌구저쩌구를 실행합니다. 🤣
//균형잡힌 문자열...이라하면...
//p가 군형잡힌 문자열이라면 그대로 반환한다.
//그렇지 않으면 균형잡힌문자열로 더이상 분리할수없는 u와 v나머지로 분류한다.
//즉 return solution(u)+solution(v)...??
//즉 앞에서부터 잘라서, isBalanced===true인 경우를 찾음. 근데 이제 두개씩 증가해가면서 찾으면 됨.
//얘가 올바른 문자열이라면 얘는 그대로 반환하고 v에 대해서 또 분리해서 수행하면 됨.
//즉 가운데 쯤에 있는 제일 문제인 놈 찾으면 됨.!!
// 올바른 문자열이 아니라면 v에 대해서 재귀적으로 수행해서 반환값을 찾음.!!
// (여기에 v반환값넣음) + u는 앞뒤 문자 제거하고, 괄호 방향디집어줌. 그리고 ()로 감싸줌..!!
function solution(p,v=null) {
if(isCorrect(p)) return p
let newP
for(let i=1;i<p.length;i+=2){
newP= p.slice(0,i+1)
if(isBalanced(newP)) {
v=p.slice(i+1)
break;
}
}
if(isCorrect(newP)) return newP+solution(v)
else{
newP = newP.slice(1,newP.length-1)
let newU = ''
for(let i=0;i<newP.length;i++){
if(newP[i]==='(') newU+=')'
else newU+='('
}
return `(${solution(v)})${newU}`
}
}
function isCorrect(str){
let stack = [];
for(let i=0;i<str.length;i++){
if(str[i]==='('){
stack.push('(')
}else{
if(stack[stack.length-1]==='('){
stack.pop()
}
else return false;
}
}
return true;
}
function isBalanced(str){
let obj = {'(':0,')':0}
for(let i=0;i<str.length;i++){
if(str[i]==='('){
obj['(']++;
}else{
obj[')']++;
}
}
return obj['(']===obj[')']?true:false
}