나만보는개발공부블로그

[프로그래머스] 괄호 회전하기 본문

Algorithms

[프로그래머스] 괄호 회전하기

alexrider94 2023. 10. 12. 18:03

문제 내용

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

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

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

 

해결 방안

괄호 문제는 스택으로 대부분 해결하기때문에 스택으로 문제를 풀었다. 여기서 회전으로 S의 모든 길이까지 각각 돌아가면서 확인하기때문에 slice함수로 각각 회전을 구현해주고 스택을 초기화시켜주면서 옳은 괄호로 되는지 카운트 해가면서 해결해나간다. 그리고 카운트 올라가는 조건으로는 스택이 비어있어야 하거나 올바르게 flag가 남아있는경우이다.

자바스크립트 코드

function solution(s) {
    let result = 0;
    for(let i = 0; i<s.length; ++i){
        const list = s.slice(i) + s.slice(0,i);
        let stack = [];
        let flag = true;
        for(let s of list){
            if(s === '{' || s === '[' || s === '(') {
                stack.push(s)
            } else {
                let curr = stack.pop();
                
                if(curr === '{' && s === '}'){
                    continue;
                }
                
                if(curr === '[' && s === ']') {
                    continue;
                }
                
                if(curr === '(' && s === ')'){
                    continue;
                }
                flag = false;
                break;
            }
        }
        
        if(flag && stack.length === 0){
            result++;
        }
    }
    
    return result;
}