[코딩 테스트] javaScript #22

안광의·2021년 9월 12일
0

코딩 테스트

목록 보기
22/38
post-thumbnail

문제

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

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

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

제한 사항

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

입출력 예

sresult
[](){}3
}]()[{2
[)(]0
}}}0

[출처] 프로그래머스(https://programmers.co.kr/learn/courses/30/lessons/76502)


function solution(s) {
    let count = 0;
    function isCorrectBrackets(str) {
      const compareArr = '(){}[]';
      if(str === '') return true;
      if(str.length % 2 !== 0) return false;
      const storage = [];
      for(let i = 0; i < str.length; i++) {
        let compareIdx = compareArr.indexOf(str[i])  
        if(compareIdx % 2 === 0) { 
          storage.unshift(compareIdx + 1) 
        } else {
          if(storage.shift() !== compareIdx) return false
        }
      }
      return true;
    };
    for(let i=0; i<s.length; i++) {
        s = s.slice(1) + s[0]
        if(isCorrectBrackets(s)) count++
    }
    return count
}

이전에 코드 스테이츠의 Toy Problem 중에서 비슷한 문제를 풀어본 적이 있어서 활용해서 쉽게 풀 수 있었다. 올바른 괄호의 조합인지 확인하는 별도의 isCorrectBrackets 함수를 선언하였고 회전하면서 함수를 실행시켜 True일 경우 Count++ 해주는 형태로 코드를 작성하였다. 괄호가 중첩되어 쓰일 경우 가장 먼저 연 괄호가 가장 나중에 닫혀야 하는 FILO의 형태를 띄고 있기 때문에 스택구조를 적용하여 isCorrectBrackets 함수를 작성하였고 괄호는 열고 닫는 짝이 맞아야해서 애초에 문자열의 길이가 홀수인 경우는 바로 false를 리턴하도록 edge case를 작성하였다.

profile
개발자로 성장하기

0개의 댓글