STUDY/Algorithm

[프로그래머스_자바스크립트] Lv.2 괄호 회전하기 / 스택, replace()

ez1n 2023. 1. 11. 15:29

 

[Javascript_ 괄호 회전하기]

 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 


 

<STUDY>

 

📢 문제 📢

 

다음 규칙을 지키는 문자열을 올바른 괄호 문자열이라고 정의합니다.

  • (), [], {} 는 모두 올바른 괄호 문자열입니다.
  • 만약 A가 올바른 괄호 문자열이라면, (A), [A], {A} 도 올바른 괄호 문자열입니다. 예를 들어, [] 가 올바른 괄호 문자열이므로, ([]) 도 올바른 괄호 문자열입니다.
  • 만약 A, B가 올바른 괄호 문자열이라면, AB 도 올바른 괄호 문자열입니다. 예를 들어, {}  ([]) 가 올바른 괄호 문자열이므로, {}([]) 도 올바른 괄호 문자열입니다.

대괄호, 중괄호, 그리고 소괄호로 이루어진 문자열 s가 매개변수로 주어집니다.

 

 s를 왼쪽으로 x (0 ≤ x < (s의 길이)) 칸만큼 회전시켰을 때 

s가 올바른 괄호 문자열이 되게 하는 x의 개수를 return 하도록 solution 함수를 완성해주세요.

 

제한사항

  • s의 길이는 1 이상 1,000 이하입니다.

 


 

<전체 코드>

 

1. replaceAll() 이용

function solution(s) {
  let count = 0;

  for (i = 0; i < s.length; i++) {
    let parenthesis = s;
    while (parenthesis.length > 0) {
      parenthesis = parenthesis.replaceAll("()", "").replaceAll("[]", "").replaceAll("{}", "");
      if (!parenthesis.includes("()") && !parenthesis.includes("{}") && !parenthesis.includes("[]")) {
        break
      };
    }

    if (parenthesis.length === 0) count++;

    s += s[0];
    s = s.substr(1, s.length - 1);
  }

  return count;
}

 

2. 스택 이용

 

function solution1(s) {
  let count = 0;
  const [openParenthesis, closeParenthesis] = [["(", "{", "["], [")", "}", "]"]];

  for (let i = 0; i < s.length; i++) {
    if (openParenthesis.includes(s[0])) {
      let stack = [];

      for (let p of Array.from(s)) {
        if (openParenthesis.includes(p)) stack.push(p)
        else {
          openParenthesis.indexOf(stack[stack.length - 1]) === closeParenthesis.indexOf(p) && stack.pop();
        }
      }

      stack.length === 0 && count++;
    }

    s += s[0];
    s = s.substr(1, s.length);
  }

  return count;
}

 


 

<코드 설명>

 

1. replaceAll() 이용하기

 

function solution(s) {
  let count = 0;

  for (i = 0; i < s.length; i++) {
    let parenthesis = s;
    while (parenthesis.length > 0) {
      parenthesis = parenthesis.replaceAll("()", "").replaceAll("[]", "").replaceAll("{}", "");
      if (!parenthesis.includes("()") && !parenthesis.includes("{}") && !parenthesis.includes("[]")) {
        break
      };
    }

    if (parenthesis.length === 0) count++;

    s += s[0];
    s = s.substr(1, s.length - 1);
  }

  return count;
}

 

- s (문자열)을 parenthesis로 복사한 뒤 "()", "{}", "[]" 가 없어질 때까지 replaceAll을 이용하여 공백으로 바꾼다.

- parenthesis 의 길이가 0이라면 count를 증가시킨다.

- 왼쪽으로 회전시킨다.

 

 

2. 스택 이용하기

 

function solution1(s) {
  let count = 0;
  const [openParenthesis, closeParenthesis] = [["(", "{", "["], [")", "}", "]"]];

  for (let i = 0; i < s.length; i++) {
    if (openParenthesis.includes(s[0])) {
      let stack = [];

      for (let p of Array.from(s)) {
        if (openParenthesis.includes(p)) stack.push(p)
        else {
          openParenthesis.indexOf(stack[stack.length - 1]) === closeParenthesis.indexOf(p) && stack.pop();
        }
      }

      stack.length === 0 && count++;
    }

    s += s[0];
    s = s.substr(1, s.length);
  }

  return count;
}

 

- 여는 괄호와 닫는 괄호를 각각 배열로 정의한다.

- s의 첫 번째 문자가 여는 괄호일 때만 아래 코드를 실행한다.

- 해당 문자열이 여는 괄호라면 stack에 추가한다.

- 닫는 괄호라면 stack의 마지막에 있는 문자열이 닫는 괄호와 짝이 맞는지 확인하고 맞다면 stack에서 마지막 문자열을 없앤다.

- stack의 길이가 0이라면 count를 증가시킨다.

 

 


 

🔆프로그래머스 Lv2. 괄호 회전하기🔆

 

👉ez1n github 구경하기👈

 

 

ez1n - Overview

Front-End Developer. ez1n has 16 repositories available. Follow their code on GitHub.

github.com