[프로그래머스] 괄호 변환 (JS)

hhkim·2023년 10월 23일
0

Algorithm - JavaScript

목록 보기
163/188
post-thumbnail

풀이 과정

  1. 올바른 괄호 문자열인지 확인: 스택
    맞으면 그대로 리턴
  2. 아니라면 u, v로 분리 (여는 괄호와 닫는 괄호의 수가 같아지는 때)
  3. 주어진 알고리즘 수행

코드

function solution(p) {
  if (isCorrect(p)) return p;

  const recursion = (str) => {
    if (!str) return str;
    const [u, v] = splitBalanced(str);
    if (isCorrect(u)) return u + recursion(v);
    else
      return (
        '(' +
        recursion(v) +
        ')' +
        u.slice(1, -1).replace(/\(|\)/g, (c) => (c === '(' ? ')' : '('))
      );
  };

  return recursion(p);
}

function isCorrect(str) {
  const s = [];
  for (const c of str) {
    if (c === '(') s.push(c);
    else s.pop();
  }
  return s.length ? false : true;
}

function splitBalanced(str) {
  let [open, close] = [0, 0];
  for (const c of str) {
    if (c === '(') ++open;
    else ++close;
    if (open && open === close) break;
  }
  const i = open + close;
  return [str.slice(0, i), str.slice(i)];
}

🦾

알고리즘을 문제에서 자세하게 설명해줘서 그대로 코드를 짜기만 하면 됐다.
문제 이해를 잘못해서 괄호 방향을 뒤집어야 하는데 문자열을 뒤집는 바람에 그거 찾느라 시간이 좀 걸렸다.
정규표현식에서 괄호는 escape가 필요하고, 여러 문자를 각각 치환하려면 |로 분리를 해주어야 한다.

0개의 댓글