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

butterbeetle·2023년 4월 14일
0

코딩테스트

목록 보기
104/132
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

내 풀이

function solution(s) {
    const arr = [...s]
    let ans = 0;
    
    const stackFn = (arr) => {
        const stack = [];
        arr.forEach(item=>{
            switch(item){
                case "(":
                case "{":
                case "[":
                    stack.push(item)
                    break;
                    
                case ")":
                    if(stack.at(-1) === "(") stack.pop()
                    else stack.push(item)
                    break;
                    
                case "}":
                    if(stack.at(-1) === "{") stack.pop()
                    else stack.push(item)
                    break;
                    
                case "]":
                    if(stack.at(-1) === "[") stack.pop()
                    else stack.push(item)
                    break;
                    
            }
        })
        if(stack?.length) return false
        else return true
    }
    
    for(let i=0; i<s.length; i++){
        const temp = [...arr];
        if(stackFn(temp)) ans++;
        arr.push(arr.shift())
    }
    
    return ans;
}

한칸씩 옳기는것 자체는 그냥 맨 앞 원소를 맨 뒤에 넣으면 되는 것이라 쉬운 일이였다.

처음에는 replace와 정규식으로 하려고 했지만
괄호들은 제대로 정규식이 먹히지 않아서 실패했고

두번째는 splice로 ( [ {의 위치를 찾아 2만큼 잘라 먹는 방식이였는데 이건 역시 )[{}]( 이렇게 괄호안 괄호가 있을때 이상해져 실패했다.

근데 결국 옳바른 괄호라는것은 열고 닫힘이 있어야 하므로
스택으로 풀면 딱이다 싶어서 지금의 정답이 나왔다.
( [ { 일때는 넣어주고 이외에는 stack배열의 마지막 원소와
현재 값을 비교해서 빼주거나 다시 넣는 식으로 하였다.

그리고 마지막에 배열이 비어있는지 한번 확인해서 옳바른지 아닌지를 판단해준다.


풀긴 풀었는데 속도가 너무 느리다..
다른 분의 풀이보다 많게는 5배는 느린것 같다..

profile
멍청이

0개의 댓글