반응형
▷ 문제 : 2020 KAKAO BLIND RECRUITMENT - 괄호 변환 LV.2
▷ 해결 날짜 : 2022.03.11
▷ 소요 시간 : 1시간 30분
▷ 풀이 과정 :
이번에는 좀 특이하게, 문제에서 로직을 전부 알려주고 우리는 그걸 구현하기만 하면 되는 문제였다.
재귀함수를 이용하면 풀 수 있는 문제이며, 재귀함수를 사용하라고 문제에서도 알려주고 있다.
이번 문제는 특이점은 없고 그냥 아래와 같은 로직을 그대로 구현할 수 있는 능력만 있으면 누구나 풀 수 있는 문제였다.
1. 입력이 빈 문자열인 경우, 빈 문자열을 반환합니다.
2. 문자열 w를 두 "균형잡힌 괄호 문자열" u, v로 분리합니다. 단, u는 "균형잡힌 괄호 문자열"로 더 이상 분리할 수 없어야 하며, v는 빈 문자열이 될 수 있습니다.
3. 문자열 u가 "올바른 괄호 문자열" 이라면 문자열 v에 대해 1단계부터 다시 수행합니다.
3-1. 수행한 결과 문자열을 u에 이어 붙인 후 반환합니다.
4. 문자열 u가 "올바른 괄호 문자열"이 아니라면 아래 과정을 수행합니다.
4-1. 빈 문자열에 첫 번째 문자로 '('를 붙입니다.
4-2. 문자열 v에 대해 1단계부터 재귀적으로 수행한 결과 문자열을 이어 붙입니다.
4-3. ')'를 다시 붙입니다.
4-4. u의 첫 번째와 마지막 문자를 제거하고, 나머지 문자열의 괄호 방향을 뒤집어서 뒤에 붙입니다.
4-5. 생성된 문자열을 반환합니다.
▷ 구현
function solution(p) {
return getBalances(p).join('');
}
function getBalances(str){
if(!str) return str;
let balance = 0;
let count = 0;
do {balance += str[count++] === "(" ? 1 : -1} while (balance !== 0);
let u = str.slice(0, count).split('');
let v = str.slice(count).split('');
if( /(?=^\()*(?=\)$)/g.test(u.join(''))){
u.push(...getBalances(v.join('')));
}else{
u = [
'('
, ...getBalances(v.join(''))
, ')'
, ...u.slice(1, -1).map(e => (e == ")") ? "(" : ")")
];
}
return u;
}
▷ 복기 :
특이하고도 쉬운 문제였음에도 불구하고 1시간 30분이나 걸렸다.
우선 위 조건에서 "균형잡힌 괄호 문자열"을 체크하는 부분에서 어떻게 이걸 효율적으로 체크를 할까 고민을 많이 했다.
여기서 30분이나 소비되는 바람에 그냥 막 코딩으로 짜다가 위 코드는 최종적으로 리팩터링 해서 나온 결과다.
그냥 고민만 하다가 아무것도 못하니 뭐라도 끄적이면서 하는 게 나을 거 같다, 코드 개선이야 나중에도 할 수 있으니
(아 정규식에서도 and조건이 도대체 뭔지 몰라서 조금 헤매었다. )
다른 사람 풀이를 봤는데, 굳이 배열을 사용해서 하나로 모으는 작업을 할 필요 없이 문자열로만 가능하다는 걸 깨달았다.
뭐 그래도 나름 신선하고(?) 개성 넘치게 풀어서 만족한다.
반응형
댓글