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

박기영·2022년 11월 27일
0

프로그래머스

목록 보기
102/126

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개의 댓글