https://programmers.co.kr/learn/courses/30/lessons/60058
문제 설명은 길기 때문에 링크로 대신해야할 것 같다.
필자가 처음 푼 문제풀이
function splitStr(str) {
let [left, right] = [0, 0];
let check = true;
let u = "";
let v = "";
for (let i = 0; i < str.length; i++) {
if (check) {
str[i] === "(" ? ++left : ++right;
u += str[i];
} else {
v = str.slice(i, str.length);
break;
}
if (left === right) {
check = false;
}
}
return [u, v];
}
function isRight(str) {
let original = str;
if (!str.length) return true;
for (let i = 1; i <= original.length / 2; i++) {
str = str.replace(/\(\)/g, "");
if (!str) {
return true;
}
}
return false;
}
function changeStr(u) {
let newU = "";
u = u.slice(1, -1);
for (let i = 0; i < u.length; i++) {
let changeU = "";
u[i] === "(" ? (changeU = ")") : (changeU = "(");
newU += changeU;
}
return newU;
}
function solution(p) {
let answer = "";
let [u, v] = splitStr(p);
if (isRight(u)) {
answer += u;
} else {
if (isRight(v)) {
answer += `(${v})`;
answer += changeStr(u);
v = "";
}
}
if (v.length) answer += solution(v);
return answer;
}
이 문제가 재귀 함수로 푸는 문제라는 것은 파악했지만 핵심을 파악하지 못해 올바른 괄호인지 확인하는 함수, 괄호를 바꾸는 함수, u와 v를 나누는 함수를 따로 두었다..😱
다음 푼 문제풀이
function solution(p) {
let answer = "";
let left = 0
let right = 0;
let check = true;
if (p.length == 0) return ""
for (let i = 0; i < p.length; i++) {
p[i] === "(" ? left++ : right++;
if (right > left) check = false;
if (left === right) {
if (!check) {
answer += "(";
answer += solution(p.slice(i + 1, p.length));
answer += ")";
for (let j = 1; j < i; j++) {
p[j] === "(" ? answer += ")" : answer += "(";
}
return answer;
} else {
answer += p.slice(0, i + 1);
answer += solution(p.slice(i + 1, p.length));
return answer;
}
}
}
}
한 함수 안에서 모두 해결했다.
여기서 핵심은 if (right > left) check = false; 이 부분이다.
괄호에서 )이 부분이 나오는 순간부터는 올바른 괄호가 될 수 없다.
그래서 그 부분부터 재귀함수를 돌려 v가 빈 문자열이 될 때까지 반복해주는 문제였다.
function reverse(str) {
return str.slice(1, str.length - 1).split("").map((c) => (c === "(" ? ")" : "(")).join("");
}
function solution(p) {
if (p.length < 1) return "";
let balance = 0;
let pivot = 0;
do { balance += p[pivot++] === "(" ? 1 : -1 } while (balance !== 0);
const u = p.slice(0, pivot);
const v = solution(p.slice(pivot, p.length));
if (u[0] === "(" && u[u.length - 1] == ")") return u + v;
else return "(" + v + ")" + reverse(u);
}
do while을 이용해 코드를 훨씬 깔끔하게 만든 것을 볼 수 있다.
그리고 괄호를 변환할 때도 reverse함수를 이용해 깔끔하게 표현하였다.
다시 코드를 해석해보면서 공부를 마쳐야겠다.
2022.02.02