2020 KAKAO BLIND RECRUITMENT
LEVEL 2
'('
, ')'
로만 이루어진 문자열 p
가 주어졌을 때 다음 알고리즘을 수행해 "올바른 괄호 문자열"로 변환한 결과를 return
하는 solution
함수를 작성하시오,
w
를 두 "균형잡힌 괄호 문자열" u
, v
로 분리합니다. 단, u
는 "균형잡힌 괄호 문자열"로 더 이상 분리할 수 없어야 하며, v
는 빈 문자열이 될 수 있습니다. u
가 "올바른 괄호 문자열" 이라면 문자열 v에 대해 1단계부터 다시 수행합니다. u
에 이어 붙인 후 반환합니다.u
가 "올바른 괄호 문자열"이 아니라면 아래 과정을 수행합니다. '('
를 붙입니다. v
에 대해 1단계부터 재귀적으로 수행한 결과 문자열을 이어 붙입니다. ')'
를 다시 붙입니다. u
의 첫 번째와 마지막 문자를 제거하고, 나머지 문자열의 괄호 방향을 뒤집어서 뒤에 붙입니다. p
'('
, ')'
로만 이루어진 문자열p
의 길이 ≤ 1,000p
를 이루는 '('
와 ')'
의 개수는 항상 같다. (문자열 p
의 길이는 짝수)function solution(p) {
// splitInTwo: 주어진 알고리즘을 실행하여 문자열을 변환하는 재귀함수
function splitInTwo(w) {
// 1. 입력이 빈 문자열인 경우, 빈 문자열을 반환
if (w === '') return '';
// 2. 문자열 w를 균형잡힌 괄호 문자열 u, v로 분리
let u, v;
let count = 0;
for (let i = 0, n = w.length; i < n; i++) {
(w[i] === '(') ? count++ : count--;
if (count === 0) {
u = w.slice(0, i+1);
v = w.slice(i+1);
break;
}
}
if (isCorrectString(u)) {
// 3. u가 올바른 괄호 문자열일 경우,
return u + splitInTwo(v);
} else {
// 4. u가 올바른 괄호 문자열이 아닐 경우,
let v2 = '(' + splitInTwo(v) + ')';
let u2 = u.split('').slice(1, -1).map(el => {
return (el === '(') ? ')' : '('
}).join('');
return v2 + u2;
}
}
// isCorrectString: 주어진 문자 u가 올바른 괄호 문자열인지 참/거짓 여부를 반환하는 함수
function isCorrectString(u) {
const stack = [];
for (let i = 0, n = u.length; i < n; i++) {
if (u[i] === '(') {
stack.push('(');
} else {
const match = stack.pop();
if (match !== '(') return false;
}
}
return (stack.length === 0) ? true : false;
}
// splitInTow에 p를 대입한 결과를 반환
return splitInTwo(p);
}