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

javascript 괄호 문자열 짝 맞추기

by 김빵그 2023. 10. 28.

문제

랜덤한 괄호 문자열이 주어질 때 서로 짝지어서 올바른 괄호 문자열이면 true 아니면 false

나의 풀이 1 (런타임 오류)

while(s.includes('()')) {
	s = s.replaceAll("()", '');
}
return s.length == 0 ? true : false;
  • includes() : 주어진 문자열 ()이 s안에 존재하는지에 따라 모든 '()' 문자를 반복적으로 제거한다. 
  • 올바른 문자열일 경우 s는 빈 문자열이 되며 종료
  • 문제는 맞았지만 2문제나 런타임 오류가 발생했다
    • 이유 : 문자열에서 '()'를 찾아 계속 제거하면서 문자열을 수정하는 작업은 문자열 길이가 길어질수록 성능 문제를 일으킬 수 있다 문자열을 반복적으로 수정하기 때문에 에러가 남

나의 풀이 2 (런타임 오류)

function solution(s){
    if(s.length % 2 !== 0 || s[0] == ')' ) {
        return false;
    }else {
        
        var arr = [];
        for(let i = 0 ; i < s.length; i++) {
            if(s[i] === "(") {
                arr.push(s[i]);
            }else if (s[i] === ")") {
                arr.length == 0 ? false : arr.pop();
            }
        }
        return arr.length == 0;

    }
    
}
  • 괄호의 개수가 홀수거나 시작 문자가 ")"인 경우 선 처리해서 false로 거른다
  • 배열 arr를 사용하여 열린 괄호 "("를 스택에 push 하고 닫힌 괄호 ")"를 스택에서 pop 하며 괄호의 짝을 확인한다
  • 런타임 에러 1문제 

나의 풀이 3

function solution(s){
    if(s.length % 2 !== 0 || s[0] == ')' ) {
        return false;
    }else {

        var arr = [];
        for(let i = 0 ; i < s.length; i++) {
            if(s[i] === "(") {
                arr.push(s[i]);
            }else if (s[i] === ")") {
               if (arr.length === 0) {
                    return false;
                } else {
                    arr.pop();
                }
            }
        }
        return arr.length == 0;

    }

}
  • 위의 코드를 좀 더 가독성있게 코드를 수정하니 제출이 완료되었다
  • 3항이 좀 더 오래 걸리는 걸까..?

다른 풀이

1) for .. of

function solution(s){
    let cum = 0
    for (let paren of s) {
        cum += paren === '('? 1: -1
        if(cum < 0) {
            return false
        }
    }
    return cum === 0? true: false;
}
  • 누적 변수 cum을 사용한다
  • for를 사용하여 문자열을 순회하면서 여는 괄호가 "(" 일때 cum을 1 증가하고 
  • 닫는괄호 ")" 일 때 cum 을 1 감소시킨다
  • cum이 음수가 되면 올바르지 않는 문자열이라고 판단하려 false 반환

2) match

function is_pair(s){
  var result = s.match(/(\(|\))/g);
  return result[0] == '(' && result.length % 2 == 0 ? true : false
}
  • 정규식 표현을 사용하여 주어질 문자열에서 괄호 ( )를 찾아 배열로 반환
  • 반환된 배열의 첫번째 요소가 "("인지 확인하고 배열의 길이가 짝수인지 검사하여 문자열 판단