본문 바로가기

코딩 및 기타/어서와! 자료구조와 알고리즘

11일차

728x90

스택의 응용 : 올바른 괄호 검사

∙ 올바른 괄호 검사

- 괄호만으로 이루어진 문자열이 주어질 때, 괄호의 종류별로 쌍이 제대로 되어 있는지를 검사하기

- 괄호의 종류 : [ ] (대괄호, brackets), { } (중괄호, braces), ( ) (소괄호, parentheses)

- 올바른 괄호의 조건 

> 괄호의 종류별로 여는 괄호와 닫는 괄호의 개수가 같아야 한다.

> 같은 종류의 괄호에서 여는 괄호가 닫는 괄호보다 먼저 나타나야 한다.

> 마지막 여는 괄호와 쌍이 되는 닫는 괄호가 먼저 나타나야 한다.

 

∙ 올바른 괄호 검사 알고리즘

- 문자열의 각 문자를 차례대로 검사

> 여는 괄호 (, {, [ 를 만나면 스택에 push

> 닫는 괄호 ), }, ] 를 만나면 

         > 스택이 비어 있으면 false 반환

         > 스택의 top에 있는 문자가 현재 닫는 괄호와 쌍을 이루는 여는 괄호인지를 검사

                  > 쌍이 맞으면 스택에서 pop

                  > 쌍이 맞지 않으면 false 반환

- 모든 문자열을 검사한 후, 스택이 비어 있는지를 검사

> 비어 있으면 true 반환

> 그렇지 않으면 false 반환

 

#include <iostream>
#include <stack>

using namespace std;

bool paren_check(const string& s)
{
    stack<char> stk;
    
    for (char c : s){
        
        // 여는 괄호를 만나면 스택에 push
        if (c == '(' || c == '{' || c == '['){
            stk.push(c);
        }
        
        // 닫는 괄호를 만나면...
        else {
            
            // 스택이 비어 있으면 false 반환
            if (stk.empty()){
                return false;
            }
            
            // 스택의 top에 있는 문자가 현대 닫는 괄호와 쌍을 이루는 여는 괄호인지를 검사...
            if ((stk.top() == '(' && c == ')') || (stk.top() == '{' && c == '}') || (stk.top() == '[' && c == ']')){
                stk.pop();
            }
            else
                return false;
        }
    }
    // 모든 문자열을 검사한 후, 스택이 비어 있는지를 검사
    if (stk.empty())
        return true;
    else
        return false;
}

    
    
int main()
{
    // 올바른 괄호
    cout << paren_check("(){}[]") << endl;
    cout << paren_check("((((()))))") << endl;
    cout << paren_check("(){[()]}") << endl;
    
    // 올바르지 않은 괄호
    cout << paren_check("((({}))") << endl;
    cout << paren_check(")(") << endl;
    cout << paren_check("({)}") << endl;
}

 

'코딩 및 기타 > 어서와! 자료구조와 알고리즘' 카테고리의 다른 글

13 일차  (0) 2023.08.21
12일차  (0) 2023.08.20
10일차  (0) 2023.08.16
9일차  (0) 2023.08.15
8일차  (0) 2023.08.13