본문 바로가기
개발/알고리즘

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

by ISA(류) 2021. 11. 4.

# 문제 원문

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

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

 

# 문제 풀이

 

입력 받은 문자열 s의 문자를 한칸씩 옆으로 이동하면서 닫힌 괄호쌍으로만 이루어졌는지 확인하고 올바른 닫힌 괄호쌍으로 이루어진 경우를 카운팅 해서 반환 하는 문제이다. 괄호쌍 비교 하는 문제들은 스택을 활용해서 푸는게 좋아서 스택을 사용했다. 입력 받은 문자열 s가 짝수라는 보장이 없으므로 홀수일 경우 올바른 괄호가 될 수 없으므로 얼리리턴으로 0을 반환해주면된다.

 

# 솔루션 플로우

1. 입력 받은 문자열 s를 2로 나누었을때 나머지가 있다면 올바른 괄호쌍이 될 수 없으므로 0을 반환한다.

2. 입력 받은 문자열 s를 문자열 배열 state로 치환하고 그 길이 만큼 반복한다.

3. 배열 state의 가장 앞의 요소를 가장 뒤로 보낸다.

4. 배열 state를 순회하면서 괄호쌍을 비교한다.

5. 모든 괄호쌍이 올바른 쌍을 이룬다면 result + 1 해준다.

6. 반복이 끝난후 얻은 result를 반환한다.

1. 스택을 활용한풀이

function solution(s) {
    if (s.length % 2 !== 0) return 0;
    const bracketSet = {
        ')': '(',
        ']': '[',
        '}': '{'
    };
    const state = Array.from(s);

    return state.reduce((result, _) => {
        const stack = [];
        state.push(state.shift());
        state.forEach((current) => {
            if (stack.length > 0) {
                if (bracketSet[current] === stack[stack.length - 1]) {
                    stack.pop();
                } else {
                    stack.push(current);
                }
            } else {
                stack.push(current);
            }
        });
        return stack.length > 0 ? result : result + 1;
    }, 0);
}
반응형