인프런 커뮤니티 질문&답변

정승연님의 프로필 이미지
정승연

작성한 질문수

자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)

1. 올바른 괄호(스택)

괄호 개수 카운

작성

·

254

0

이런식으로 괄호의 개수를 카운트 해서 짜봤는데 괜찮은가요??

<html>
    <head>
        <meta charset="UTF-8">
        <title>출력결과</title>
    </head>
    <body>
        <script>
            function solution(s){
                let answer="YES";
                let array1 = [];
                let array2 = [];    
                for(let a of s){
                    if(a ==="(") array1.push(a);
                    if(a===")")array2.push(a);
                }
                if(array1.length!==array2.length) answer=false;
                return answer;
            }
            
            let a="(()(()))(()";
            console.log(solution(a));
        </script>
    </body>
</html>

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.

제시해 주신 코드는 괄호의 개수만을 비교하여, 여는 괄호와 닫는 괄호의 개수가 일치하는지를 판별하는 접근법을 사용하고 있습니다. 이 방법은 여는 괄호와 닫는 괄호의 개수만 같다면 ‘YES’를 반환하지만, 이는 괄호의 순서가 잘못된 경우에도 ‘YES’를 반환할 수 있기 때문에 올바른 괄호 짝짓기 문제에 적절하지 않습니다.

예를 들어, 입력이 (())())인 경우에도 여는 괄호 4개, 닫는 괄호 3개로 개수는 같지 않으므로 false를 반환하겠지만, (())(() 경우에는 여는 괄호 4개, 닫는 괄호 4개로 개수가 같음에도 불구하고 올바르지 않은 괄호 구조이므로 “YES”라고 잘못 판별할 수 있습니다.

괄호 문제를 해결하기 위해서는 스택을 사용하여 여는 괄호를 만났을 때는 스택에 삽입하고, 닫는 괄호를 만났을 때는 스택에서 여는 괄호를 하나 빼내며, 이 과정에서 스택이 비어있다면 올바르지 않은 괄호로 판단하여 빠르게 ‘NO’를 반환해야 합니다. 또한, 모든 과정이 끝난 후에 스택이 비어있지 않다면, 여는 괄호가 더 많은 경우이므로 이때도 ‘NO’를 반환하게 됩니다.

다음은 스택을 사용하여 괄호 문제를 해결하는 코드의 예시입니다:

function solution(s){
    let stack = [];
    for(let bracket of s){
        if(bracket === "("){
            stack.push(bracket);
        } else if(bracket === ")"){
            if(stack.length === 0) return 'NO';
            stack.pop();
        }
    }
    if(stack.length > 0) return 'NO';
    return 'YES';
}

let a = "(()(()))(()";
console.log(solution(a)); // 'NO'

이 코드는 괄호의 개수 뿐만 아니라, 순서까지 고려하여 올바른 괄호 구조를 판단합니다. 위 코드에서는 ‘NO’를 정확하게 반환하고 있음을 확인할 수 있습니다.

정승연님의 프로필 이미지
정승연

작성한 질문수

질문하기