안녕하세요

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

프로그래머스/Lv.2

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

sakuraop 2022. 11. 27. 15:21
  • 괄호 회전하기
문제 설명

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

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

문제 풀이

괄호 쌍이 올바른지 확인합니다.
    const checkBrackets = () => {
        for (let i = 0; i < s.length; i++) {
            // 여는 괄호 [,(,{ 중 하나라면 stack에 추가합니다.
            // 여는 괄호가 추가된 스택상태 ex) [ "[", "{", "(" ]
            if (Object.values(bracket).includes(s[i])) {
                stack.push(s[i]);
                continue;
            }
            // 여는 괄호는 continue로 넘어가므로 여기서는 닫는 괄호 중 하나가 옵니다.
            // stack의 길이가 0이라면 닫는 괄호가 먼저 온 것이므로 괄호 쌍이 맞지 않게 되어 더 이상 확인할 필요 없이 종료합니다.
            // 스택상태 ex) [ "]" ] => 종료
            if (stack.length === 0) {
                stack.push(s[i]);
                return;
            }
            // stack의 마지막 괄호와 닫는 괄호가 쌍을 이루면 마지막 괄호를 stack에서 제거합니다.
            // 스택상태 ex)  [ "[", "{", "(" ] => ")" 가 들어와서 쌍이 맞음 "("를 제거 =>  [ "[", "{" ]
            if (stack[[stack.length - 1]] === bracket[s[i]]) {
                stack.pop();
            }
        }
    };





괄호가 비어있다면 올바른 쌍으로 이루어진 것이므로 answer에 1을 더합니다.
    const setAnswer = () => {
        if (stack.length === 0) {
            answer++;
        }
    };




문제의 조건대로 왼쪽으로 한 칸 밀어줍니다.
첫번째 문자를 마지막으로 보낸 형태를 만들면 됩니다.
    const rotateS = () => {
        const first = s[0];
        let slicedS = s.slice(1);
        slicedS += first;
        return slicedS;
    };




왼쪽으로 한 칸 씩 문자열의 길이만큼 밀어주며 모든 경우를 실행한 결과를 반환합니다.
    for (let i = 0; i < s.length; i++) {
        checkBrackets();
        setAnswer();
        s = rotateS();
        stack = [];
    }
    return answer;




function
solution(s) {
    let stack = [];
    let answer = 0;

    const bracket = {
        "]": "[",
        ")": "(",
        "}": "{",
    };

    const checkBrackets = () => {
        for (let i = 0; i < s.length; i++) {
            if (Object.values(bracket).includes(s[i])) {
                stack.push(s[i]);
                continue;
            }
            if (stack.length === 0) {
                stack.push(s[i]);
                return;
            }
            if (stack[[stack.length - 1]] === bracket[s[i]]) {
                stack.pop();
            }
        }
    };

    const setAnswer = () => {
        if (stack.length === 0) {
            answer++;
        }
    };

    const rotateS = () => {
        const first = s[0];
        let slicedS = s.slice(1);
        slicedS += first;
        return slicedS;
    };

    for (let i = 0; i < s.length; i++) {
        checkBrackets();
        setAnswer();
        s = rotateS();
        stack = [];
    }

    console.log(answer);
    return answer;
}

solution("[](){}");