코딩테스트

[JS] 괄호 회전하기

미안하다 강림이 좀 늦었다 2023. 12. 5. 22:06

 

 

난이도: Lv.2

문제: https://school.programmers.co.kr/learn/courses/30/lessons/76502

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

알고리즘

1. 모든 종류의 여는 괄호는 stack에 push한다.

2. 닫는 괄호가 나오면 stack의 맨 윗 원소의 괄호 종류와 일치하는지 확인한다. 종류가 일치하지 않으면 올바른 괄호 문자열이 아니기 때문에 false를 반환하고, 종류가 일치하다면 stack 맨 윗 원소를 pop한다. 예를 들자면 stack에 "[({"가 있다. 이번 괄호가 ')'라면 틀린 괄호 문자열이 된다는 뜻이다.

3. 끝까지 진행했을 때 stack에 원소가 남아있다면 괄호 쌍의 개수가 맞지 않으므로 올바른 괄호 문자열이 아니다. stack이 비어있다면 올바른 괄호 문자열이므로 true를 반환한다.

 

 

코드

function solution(s) {
    var answer = 0;

    if (isValid(s)) { answer++; }
    for (let x = 0; x < s.length - 1; x++) {
        s = s.substring(1, s.length) + s.substring(0, 1);
        if (isValid(s)) { answer++; }
    }

    return answer;
}

const isValid = (s) => {
    const stack = [];

    for (let bracket of s) {
        switch (bracket) {
            case ')':
                if (stack[stack.length - 1] === '(') { stack.pop(); break; }
                else { return false; }
            case '}':
                if (stack[stack.length - 1] === '{') { stack.pop(); break; }
                else { return false; }
            case ']':
                if (stack[stack.length - 1] === '[') { stack.pop(); break; }
                else { return false; }
            default:
                stack.push(bracket);
        }
    }

    if (stack.length) { return false; }
    return true;
}

 

 

주저리

올바른 괄호 문제랑 비슷한 문제인데 처음에 테스트케이스 마지막 문제만 통과 못했었다. 생각해보니까 "[{(})]" 이런 문자열을 틀렸다고 거르지 못해서 푸는데 당황 좀 했다.