프로그래머스 코딩 문제 2021/04/20 - Lv.2 괄호 회전하기

이호현·2021년 4월 20일
0

Algorithm

목록 보기
105/138

[문제]

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

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

대괄호, 중괄호, 그리고 소괄호로 이루어진 문자열 s가 매개변수로 주어집니다. 이 s를 왼쪽으로 x (0 ≤ x < (s의 길이)) 칸만큼 회전시켰을 때 s가 올바른 괄호 문자열이 되게 하는 x의 개수를 return 하도록 solution 함수를 완성해주세요.


제한사항

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

입출력 예

s result
"[](){}" 3
"}]()[{" 2
"[)(]" 0
"}}}" 0

입출력 예 설명
입출력 예 #1

  • 다음 표는 "{}" 를 회전시킨 모습을 나타낸 것입니다.

    x s를 왼쪽으로 x칸만큼 회전 올바른 괄호 문자열?
    0 "[](){}" O
    1 "](){}[" X
    2 "(){}[]" O
    3 "){}[](" X
    4 "{}[]()" O
    5 "}[](){" X
  • 올바른 괄호 문자열이 되는 x가 3개이므로, 3을 return 해야 합니다.

입출력 예 #2

  • 다음 표는 "}]()[{" 를 회전시킨 모습을 나타낸 것입니다.
    x s를 왼쪽으로 x칸만큼 회전 올바른 괄호 문자열?
    0 "}]()[{" X
    1 "]()[{}" X
    2 "()[{}]" O
    3 ")[{}](" X
    4 "[{}]()" O
    5 "{}]()[" X
  • 올바른 괄호 문자열이 되는 x가 2개이므로, 2를 return 해야 합니다.

입출력 예 #3

  • s를 어떻게 회전하더라도 올바른 괄호 문자열을 만들 수 없으므로, 0을 return 해야 합니다.

입출력 예 #4

  • s를 어떻게 회전하더라도 올바른 괄호 문자열을 만들 수 없으므로, 0을 return 해야 합니다.

[풀이]

function solution(s) {
  let answer = 0;
  const length = s.length;
  const obj = {
    ')': '(',
    '}': '{',
    ']': '['
  }
  let stack = [];
  let check = false;
   
  for(let i = 0; i < length; i++) {
    for(let j = 0; j < length; j++) {
      if(!obj[s[j]]) {
        stack.push(s[j]);
      }
      else {
        if(!stack.length || obj[stack[stack.length - 1]]) {
          check = true;
          break;
        }
               
        if(obj[s[j]] === stack[stack.length - 1]) {
          stack.pop();
        }
      }
    }
       
    if(!check) {
      if(stack.length) {
        stack = [];
      }
      else {
        answer++;
      }    
    }
       
    check = false;
     
    s = s.slice(1) + s.slice(0, 1);
  }
 
  return answer;
}

예전에 했던 괄호 맞추기 문제를 이용해서 풀었다.

괄호 짝을 객체로 만들고, 스택을 만들어서 하나씩 비교해 가며 push, pop을 이용해 스택에 남은 개수가 있는지 판별하는 것이다.

그런데 한 번만 하는게 아니라 제일 앞에 문자를 맨 뒤로 보내는걸 문자열 길이만큼 반복하는 로직만 추가해주면 된다.

올바른 괄호가 아닐경우 바로 그만하고, 다시 하나씩 옮겨서 다시 비교해야 되는데 그걸 확인할 변수인 check를 사용했다.

profile
평생 개발자로 살고싶습니다

0개의 댓글