/**
* 올바른 괄호 문자열인지 판단해서 boolean 값으로 반환하는 함수
*
* @param {string} str 괄호 문자열
* @returns {boolean}
*/
function isValid(str) {
let cnt = 0;
for (let i = 0; i < str.length; i += 1) {
cur = str[i];
if (cur === '(') {
cnt += 1;
} else {
cnt -= 1;
}
if (cnt < 0) return false;
}
return true;
}
/**
* w를 두 "균형잡힌 괄호 문자열" u, v로 분리하는 함수.
* 단, u는 "균형잡힌 괄호 문자열"로 더 이상 분리할 수 없어야 한다.
* v는 빈 문자열이 될 수 있다.
*
* @param {string} w 괄호 문자열
* @returns {string[]} u, v
*/
function seperateString(w) {
let [u, v] = ['', ''];
let cnt = 0;
let cur = '';
for (let i = 0; i < w.length; i += 1) {
cur = w[i];
if (cur === '(') {
cnt += 1;
} else {
cnt -= 1;
}
u += cur;
if (cnt === 0) {
v = w.slice(i + 1);
break;
}
}
return [u, v];
}
/**
* 괄호 문자열을 받아서 괄호의 방향을 반대로 해서 반환하는 함수
*
* @param {*} str 괄호 문자열
* @returns {string} 변환한 괄호 문자열
*/
function flip(str) {
let result = '';
const pair = {
'(': ')',
')': '(',
};
str.split('').forEach((el) => {
result += pair[el];
});
return result;
}
function solution(p) {
if (p === '') return p;
let u, v;
[u, v] = seperateString(p);
if (isValid(u)) {
return u + solution(v);
}
// 괄호 방향 바꾸기
return `(${solution(v)})${flip(u.slice(1, -1))}`;
}
문제가 설명이 많아서 뭔가 복잡해 보이는 문제지만 모든 로직을 순서까지 다 설명해놔서 그대로 구현하기만 하면 되는 문제였다. 마지막에 괄호 방향을 바꾼다는것이 처음에 문자열을 reverse 하는것으로 착각해서 틀렸었지만, 그 외에는 쉽게 해결했다.
'PS > Programmers' 카테고리의 다른 글
Programmers / Level 3 / 베스트앨범 / JS (0) | 2024.04.15 |
---|---|
Programmers / Level 2 / 숫자의 표현 / JS (0) | 2023.06.24 |
Programmers / Level 2 / 수식 최대화 / JS (0) | 2023.02.04 |
Programmers / Level 2 / 삼각 달팽이 / JS (0) | 2023.02.01 |