Lvl-2 스택/큐 올바른 괄호

jsonLee·2023년 1월 13일
0

프로그래머스

목록 보기
1/1
post-thumbnail

문제 설명

괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다. 예를 들어

"()()" 또는 "(())()" 는 올바른 괄호입니다.
")()(" 또는 "(()(" 는 올바르지 않은 괄호입니다.
'(' 또는 ')' 로만 이루어진 문자열 s가 주어졌을 때, 문자열 s가 올바른 괄호이면 true를 return 하고, 올바르지 않은 괄호이면 false를 return 하는 solution 함수를 완성해 주세요.

제한사항
문자열 s의 길이 : 100,000 이하의 자연수
문자열 s는 '(' 또는 ')' 로만 이루어져 있습니다.

function solution(s) {
    if (s.length === 1 || s[0] === ")") return false;
    const stack = [];
    const queue = [...s];
    for (let i = 0; i < s.length; i++) {
     	if (stack[0] ===')') return false;
        if (!stack.length) {
            stack.push(queueLetter);
            continue;
        }
        const queueLetter = queue.shift(); // [1]    
        stack[stack.length - 1] === queueLetter ? stack.push(queueLetter) : stack.pop(); // [2]
    }
    return stack.length === 0 ? true : false;
}

핵심 원리는 파라미터로 들어온 문자열을 큐로 생각하고, 문자 하나하나를 스택으로 컨트롤 하는것. 스택이 비어있으면 true를 반환하고 아니면 false를 반환하는 메소드다.

로직은 큐에서 문자를 하나씩 shift()로 뺀 다음 [1] 전 스택 top에 있는 문자열과 비교하여 같으면 스택에 넣고 아니면 스택의 top 요소를 빼는 로직이다. [2]

중간중간에 있는 분기문은 효율성을 위해 넣은 코드들 일뿐. 핵심은 큐와 스택의 개념을 생각해서 푸는것이 핵심이라 생각한다. 그러나 이또한 효율성 문제가 있어서 좀 단순하게 바꾸게 되었다.

function solution(s) {
    if (s[0] === ')') {
        return false
    }
    let balance = 0
    for (let i = 0; i < s.length; i++) {
        if (s[i] === '(') {
            balance += 1
        } else {
            balance -= 1
        }
        if (balance < 0) return false
    }
    return balance === 0 ? true : false
}
profile
풀스택 개발자

0개의 댓글