[프로그래머스 레벨투] 괄호 변환 🧟‍♀️🧟‍♂️

🔽 문제 링크

https://programmers.co.kr/learn/courses/30/lessons/60058

✍🏼 나의 수도 코드

1) 올바른 괄호 문자열인지 아닌지 판별하는 함수를 만든다.
2) 균형잡힌 괄호 문자열인지 아닌지 판별하는 함수를 만든다.
3) 문제에서 제공한 알고리즘으로 코드를 구현한다.

// 문제에서 제공한 수도코드
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 checkBalanced(p){
    let openBracket = 0;
    let closeBracket = 0;
    p.split("").forEach(bracket => bracket === "(" ? openBracket++ : closeBracket++)
    if(openBracket === closeBracket) return true;
    else return false;
}

function checkRight(p) {
    let openBracket = 0;
    let closeBracket = 0;
    let pArr = p.split("");
    let result = true;
    
    for(let bracket of pArr){
        bracket === "(" ? openBracket++ : closeBracket++;
        if(closeBracket > openBracket){
            result = false;
            break;
        }
    }
    if(openBracket !== closeBracket){
        result = false;
    }
    return result;
}

function solution(p) { 
    
    if(checkRight(p)) return p;
    if(p === "") return "";
    
    let u = "";
    let v = "";
    
    for(let i = 0; i < p.length / 2; i++){
        u += p.substr(i * 2, 2);
        if(checkBalanced(u)){
            v = p.slice(u.length);
            break;
        }
    }
    
    if(checkRight(u)){
        return u + solution(v);
    } else {
        let uArr = u.split("");
        uArr.shift();
        uArr.pop();
        uArr = uArr.map(bracket => bracket === ")" ? "(" : ")");
        return "(" + solution(v) + ")" + uArr.join("");
    }
    
}

👩🏻‍💻 다른 사람의 코드

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

🍯 알게 된 것들

do...while

do...while 문은 테스트 조건이 거짓으로 평가될 때까지 지정된 구문을 실행하는 루프를 만듭니다.
단, 구문이 실행된 뒤에 테스트 조건이 평가됨으로 구문은 무조건 한 번은 실행됩니다.

let result = '';
let i = 0;

do {
  i = i + 1;
  result = result + i;
} while (i < 5);

console.log(result);
// expected result: "12345"
  • 함수를 만들 때는 좀 더 단순한 로직이 없는지 고민해보기! 내가 만든 코드의 checkRight 함수는 사실, 스택에 처음들어오는 글자가 (이냐 아니냐를 통해서도 확인이 가능하다.
  • 문제 꼼꼼히 읽기! 문제에서 의미했던 reverse는 Array.prototype.reverse()의 의미가 아니라, 괄호를 반대 방향으로 바꾸라는 의미였다.

좋은 웹페이지 즐겨찾기