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

1 분 소요

문제 링크

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


풀이 과정

스택에 문자열 substring()을 사용해 풀었습니다.


let tmp = s.substring(i) + s.substring(0, i);

먼저 substring()을 통해 주어진 문자열을 한 칸씩 회전시킵니다.


for (let j = 0; j < tmp.length; j++) {
    let ch = tmp[j];

    if (ch === "(" || ch === "{" || ch === "[") {
        stack.push(ch);
    } else if (ch === ")") {
        if (stack.length === 0) {
            wrong = true;
            break;
        }

        if (stack.length && stack[stack.length - 1] === "(") stack.pop();
    } else if (ch === "}") {
        if (stack.length === 0) {
            wrong = true;
            break;
        }

        if (stack.length && stack[stack.length - 1] === "{") stack.pop();
    } else if (ch === "]") {
        if (stack.length === 0) {
            wrong = true;
            break;
        }

        if (stack.length && stack[stack.length - 1] === "[") stack.pop();
    }
}

이후 위와 같이 올바른 괄호쌍인지를 확인하는 과정을 거칩니다.

  • 여는 괄호( (, {, [ )면 스택에 넣습니다.
  • 닫는 괄호인 경우 다음과 같이 작동합니다.
    • 스택이 비어있다면, 올바른 괄호쌍이 될 수 없으므로 중간에 그만둡니다.
    • 스택에 요소가 들어있고, 스택 top이 매칭되는 여는 괄호일 경우 스택에서 제거합니다.


if (!wrong && !stack.length) answer++;

올바른 괄호쌍이며(!wrong), 스택에 요소가 들어있다면(!stack.length) 카운트 해줍니다.


코드

function solution(s) {
    let answer = 0;

    for (let i = 0; i < s.length; i++) {
        let tmp = s.substring(i) + s.substring(0, i);
        let stack = [];
        let wrong = false;

        for (let j = 0; j < tmp.length; j++) {
            let ch = tmp[j];

            if (ch === "(" || ch === "{" || ch === "[") {
                stack.push(ch);
            } else if (ch === ")") {
                if (stack.length === 0) {
                    wrong = true;
                    break;
                }

                if (stack.length && stack[stack.length - 1] === "(") stack.pop();
            } else if (ch === "}") {
                if (stack.length === 0) {
                    wrong = true;
                    break;
                }

                if (stack.length && stack[stack.length - 1] === "{") stack.pop();
            } else if (ch === "]") {
                if (stack.length === 0) {
                    wrong = true;
                    break;
                }

                if (stack.length && stack[stack.length - 1] === "[") stack.pop();
            }
        }

        if (!wrong && !stack.length) answer++;
    }

    return answer;
}

console.log(solution("[](){}"));
console.log(solution("}]()[{"));
console.log(solution("[)(]"));
console.log(solution("}}}"));

댓글남기기