프로그래머스 | 올바른 여러 종류의 괄호

chaen·2024년 2월 16일
post-thumbnail

📌 문제

총 4가지 종류의 괄호가 있으며, 각 괄호는 짝이 있습니다.
괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다.

이때 주어진 문자열 s가 괄호가 서로 교차하지 않은 형태로 짝이 잘 맞게 이루어진 문자열인지 판단하여 맞다면 1, 아니라면 0을 반환하세요.

제한사항
문자열 s의 길이 : 0 초과 100 이하의 자연수
괄호의 종류: (, ), {, }, [, ], <, >

입출력 예

sreturn
"(()){[<>]}"1
"({)}[<]>"0

✨ 해결방법

우선 주어진 쌍 여는 괄호와 닫는 괄호를 동급으로 취급하면 쉽게 풀이가 가능합니다.

또한 여는 괄호가 나오면 stack에 우선 집어 넣기 위해 정규 표현식을 사용합니다. 표현식은 /[({[<]/ 로 작성할 수 있으며, 정규표현식의 만족 여부를 판단하는 test 함수로 조건문을 만듭니다.

두 괄호가 짝지어서 나온다면 pop 아니라면 0 또는 push를 실행하여 최종적으로 스택 길이가 0이라면 옳은 괄호식으로 판명할 수 있습니다.

💻 solution 1

function solution(S) {
    let stack = [];
  
  const isPair = (open, close) => {
        const pairs = { '(': ')', '[': ']', '{': '}', '<': '>' };
        return pairs[open] === close;
    };

    for (let c of S){
        if (/[({[<]/.test(c) ){
            stack.push(c);
        } else if (isPair(stack[stack.length - 1], c)){
            stack.pop();
        } else {
            return 0;
        }
    }
    return stack.length === 0 ? 1 : 0;
}

stack의 마지막 요소와 현재 요소가 같은지를 앞서 작성한 동급 함수를 사용하여 검사하고, 맞다면 마지막 요소를 pop하여 스택에서 삭제합니다.
아니라면, 더 이상 검사할 필요 없이 0을 반환하고 반복문을 종료합니다.

0개의 댓글