본문 바로가기
기초다지기/JS 코딩테스트

javascript 괄호 일치 문제 해결하기 ("(){}[]")

by 김빵그 2023. 10. 28.

문제 

주어진 문자열 s에 포함된 괄호 문자열이 유효한지 확인 (), {}, []

코드 풀이 1

var isValid = function(s) {
    var stack = [];
    var start = "({[";
    var end = ")}]";

    if(s.length % 2 !== 0 || end.includes(s[0])) {
        return false;
    }

    for (let c of s) {
        if(start.includes(c)) {
            stack.push(c);
        }else {
            const last = stack.pop();
            const exp = end[start.indexOf(last)];
            
            if (c !== exp) {
                return false;
            }
        }
    }
    return stack.length == 0;
};
  • stack : 빈 배열
  • start 와 end는 각각 열린 괄호와 닫힌 괄호를 정의한다
  • 문자열 s의 길이가 홀수이거나 문자열의 첫번째 글자가 end 닫힌 괄호로 시작하는 경우 false 처리
  • 문자열 s의 각 글자를 비교한다 
    • 만약 start에 들어있는 글자일시 stack에 추가
    • last : stack 배열에서 마지막으로 pop된 열린괄호 문자
    • exp : 열린괄호 last에 대응하는 닫힌 괄호로 닫힌괄호[start.indexOf(last)] 로 얻을 수 있다 
    • 각 글자와 닫힌괄호가 맞지 않으면 false

 

코드 풀이 2

var isValid = function(s) {
    var stack = [];
    var arr = {
        "(" : ")", 
        "{" : "}",
        "[" : "]"
    }


    for (let c of s) {
        if(arr[c]) {
            stack.push(c);
        }else {
           if (stack.length === 0 || arr[stack.pop()] !== c) {
                return false;
            }
        }
    }
    return stack.length == 0;
};
  • stact 빈 배열 
  • arr 각 열린 괄호와 닫힌 괄호의 짝
  • arr 객체에 c가 존재하고 열린괄호라면 stack에 c를 추가
  • 그렇지 않으면 닫힌괄호 
    • stack 길이가 0 열린 괄호와 대응하는 닫힌 괄호가 없는 것이므로 false 
    • arr[stack.pop()] ! == c 는 스택에서 가장 최근에 추가된 열린 괄호를 비교해 닫힌괄호 c와 짝이 맞지 않는 경우 false