프로그래머스 JS LV2

LV2 16 괄호 회전하기

와라리요 2023. 2. 15. 10:37

문제 설명

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

  • (), [], {} 는 모두 올바른 괄호 문자열입니다.
  • 만약 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

 

나만의 풀이

  이 문제를 간단하게 이야기하면 문자열의 길이만큼 왼쪽으로 밀고 첫 글자는 끝으로 간다. 그렇게 했을 때 각 문자열 안에 있는 모든 괄호들이 올바른 형태를 하고 있다는 문자열 가짓수를 구하면 된다.

  나는 우선 반복문을 이용해 왼쪽으로 밀어서 만드는 문자열을 만들고 그때마다 이중 반복문을 사용해 문자열의 index위치에 새롭게 선언한 빈배열에 넣고 조건문을 이용해 () || {} || []의 형태가 나온다면 pop으로 계속 제거하고 이중 반복문 끝에 배열의 길이가 0일 경우 count라는 변수에 +1을 했다.

  그리고 마지막으로 return count;를 하면 끝~~

function solution(s) {
    let str = s;
    let conut = 0;
    
    for (let i = 0; i < s.length; i++) {
        str += str[0];
        str = str.substr(1);
        const arr = [];
        
        for (let j = 0; j < s.length; j++) {
            arr.push(str[j]);
            const a = arr[arr.length - 2];
            const b = arr[arr.length - 1];
            
            if (a ==='[' && b === ']' || a ==='(' && b === ')' || a === '{' && b === '}') {
                arr.pop();
                arr.pop();
            }
        }
        arr.length === 0 && conut++;
    }
    
    return conut;
}