[프로그래머스 | Javascript] 올바른 괄호

박기영·2022년 11월 27일

프로그래머스

목록 보기
102/159

solution

function solution(s){
    if(s[0] === ')'){
        return false;
    }
    
    if(s[s.length - 1] === '('){
        return false;
    }
    
    let stack = [];
    
    for(let i = 0; i < s.length; i++){
        stack.push(s[i]);
        
        if(stack[stack.length - 2] === '(' && stack[stack.length - 1] === ')'){
            stack.pop();
            stack.pop();
        }
    }
    
    if(stack.length > 0){
        return false;
    }
    
    return true;
}

스택을 활용하는 문제이다.
( 문자와 )로 감싸져야만 올바른 문자이다.

만약, 주어진 문자가 )로 시작하면 이는 어떻게 해도 올바르지 않으므로 예외 처리한다.
또한, 주어진 문자가 (로 끝나면 어떻게 해도 올바르지 않으므로 예외 처리한다.

stack에 ( 문자가 들어온 뒤 ) 문자가 이어지면 바로 stack에서 제거한다.
이 과정을 주어진 문자열에 대하여 전부 진행한다.
마지막 문자열까지 연산이 끝난 뒤 stack을 확인한다.

올바른 문자라면 stack에는 남는 것이 없어야한다.
따라서 stack의 길이가 0보다 크면 올바르지 않은 문자이므로 false를 반환한다.

다른 분 풀이

function solution(s){
    if(s[0] === ')'){
        return false;
    }
    
    if(s[s.length - 1] === '('){
        return false;
    }
    
    let cum = 0
    
    for (let paren of s) {
        cum += paren === '('? 1: -1
        if(cum < 0) {
            return false
        }
    }
    return cum === 0? true: false;
}

다른 분 풀이 중 참신한게 있어서 가져왔다.
그대로 복붙해봤더니 효율성 테스트에서 시간초과가 걸려서 필자 풀이 중 예외 처리 부분을 적용했다.
그랬더니 효율성 테스트에서 필자의 풀이보다 1ms 정도 빨랐다.
스택 구조의 push()와 pop()을 1과 -1로 표현하신 것 같다.

profile
나를 믿는 사람들을, 실망시키지 않도록

0개의 댓글