[Lv.2] 괄호 회전하기

2023-10-16

문제 설명

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

  • (), [], 는 모두 올바른 괄호 문자열입니다.
  • 만약 A가 올바른 괄호 문자열이라면, ("A"), ["A"], "A" 도 올바른 괄호 문자열입니다. 예를 들어, [] 가 올바른 괄호 문자열이므로, ([]) 도 올바른 괄호 문자열입니다.
  • 만약 A, B가 올바른 괄호 문자열이라면, AB 도 올바른 괄호 문자열입니다. 예를 들어, 와 ([]) 가 올바른 괄호 문자열이므로, ([]) 도 올바른 괄호 문자열입니다. 대괄호, 중괄호, 그리고 소괄호로 이루어진 문자열 s가 매개변수로 주어집니다. 이 s를 왼쪽으로 x (0 ≤ x < (s의 길이)) 칸만큼 회전시켰을 때 s가 올바른 괄호 문자열이 되게 하는 x의 개수를 return 하도록 solution 함수를 완성해주세요.

제한 사항

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

풀이

  1. 괄호 문자열을 회전시키기 위한 반복문을 만든다.
  2. 반복할 때마다 회전시키도록 한다.
  3. 회전시킨 문자열을 올바른 괄호 문자열인지 검증한다.
  4. 검증하기 위해 스택을 만든다.
  5. 각각 회전시킨 문자열을 검증하기 위해 반복문을 만든다.
  6. 문자 하나마다 스택에 넣고 짝이 맞는지 확인한다.
  7. 짝이 맞으면 스택에서 빼고 맞지 않으면 더이상 확인할 필요가 없기 때문에 브레이크시킨다.

통과 코드

function solution(s) {
  var answer = 0;
  
  for (var i = 0; i < s.length; i++) {
    var rotateS = s.slice(i).concat(s.slice(0, i)); // 회전시킨 문자열
    var stack = []; // 스택
 
    for (var j = 0; j < s.length; j++) {
      // 오른쪽 괄호일 때만 스택에 가장 끝에 있는 요소가 왼쪽 괄호인지 확인한다.
      if (rotateS[j] === ')') {
        if (stack[stack.length - 1] === '(') {
          stack.pop();
        }
        else {
          break;
        }
      }
      else if (rotateS[j] === '}') {
        if (stack[stack.length - 1] === '{') {
          stack.pop();
        }
        else {
          break;
        }
      }
      else if (rotateS[j] === ']') {
        if (stack[stack.length - 1] === '[') {
          stack.pop();
        }
        else {
          break;
        }
      }
      else {
        stack.push(rotateS[j]); 
      }
 
      if (j === s.length - 1 && !stack.length) {
        answer++;
      }
    }
  }
  
  return answer;
}
stack

프로필 사진
TaeWoo Kim
Junior Frontend Engineer