[프로그래머스] 코딩테스트 연습 - 33

krkorklo·2022년 2월 4일
0

프로그래머스

목록 보기
33/78

level 2 - 괄호 변환

'(' 와 ')' 로만 이루어진 문자열이 있을 경우, '(' 의 개수와 ')' 의 개수가 같다면 이를 균형잡힌 괄호 문자열이라고 부릅니다. 그리고 여기에 '('와 ')'의 괄호의 짝도 모두 맞을 경우에는 이를 올바른 괄호 문자열이라고 부릅니다.
"균형잡힌 괄호 문자열" p가 매개변수로 주어질 때, 주어진 알고리즘을 수행해 "올바른 괄호 문자열"로 변환한 결과를 return 하도록 solution 함수를 완성해 주세요.

입출력 예시
p : "()))((()"
-> "()(())()"

function solution(p) {
    var answer = '';
    
    function process(str) {
        var [u, v] = split(str);
        if (str.length == 0) return "";
        if (check(u)) return u + process(v);
        else {
            var s = reverse(u);
            return '(' + process(v) + ')' + s;
        }
    }
    function split(str) {
        var left = 0;
        var right = 0;
        var idx = 0;
        var arr = str.split("");
        for (var i=0; i<arr.length; i++) {
            if (arr[i] == '(') left++;
            else right++;
            if (left == right) {
                idx = i;
                break;
            }
        }
        return [str.slice(0, idx + 1), str.slice(idx + 1, str.length)];
    }
    function reverse(str) {
        var split_str = str.split("").slice(1, str.length - 1);
        var result = "";
        split_str.forEach((s) => {
            if (s == "(") result += ")";
            else result += "(";
        })
        return result;
    }
    function check(str) {
        var stack = [];
        str.split('').forEach((s) => {
            if (s == '(') stack.push(s);
            else if (s == ')' && stack.length == 0) return false;
            else stack.pop();
        })
        if (stack.length == 0) return true;
        return false;
    }
    
    return answer = process(p);
}

아직 코드 제대로 이해 못했다
ㅎㅎㅎ
...

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);
}

이 코드가 제일 이해하기 쉽고 단순하더라
우와

0개의 댓글