[C++로 풀이] 올바른 괄호 ⭐⭐

Date:     Updated:

카테고리:

태그:

📌 올바른 괄호

난이도 ⭐⭐

🚀 문제

image


🚀 내 풀이 ⭕

#include <string>
#include <iostream>
#include <stack>

using namespace std;

bool solution(string s)
{
    stack<int> st;
    int openCount = 0;  // '('의 개수
    int closeCount = 0; // ')'의 개수
    
    // s 문자열 순회
    for(int i = 0; i < s.length(); i++)
    {
        if (s[i] == '(')
        {
            st.push(s[i]);
            openCount++;
        }
        
        if (s[i] == ')')
        {
            closeCount++;
            
            if (!st.empty())
                st.pop();
        }
    }
    
    // s 문자열 순회 끝
    if (st.empty() && openCount == closeCount && openCount > 0 && closeCount > 0)
        return true;
    else
        return false;
}
  • 올바른 괄호의 조건
    • 1️⃣ 문자열 s 전부 검사 후 비어있는 스택이 되었을 때 👉 스택으로 짝 찾기
      • 로직
        • ( 일때 스택에 넣는다. 스택엔 ( 만 쌓이게 된다.
        • ) 가 나올 때 스택에서 Pop 하여 가장 위에 있는 (을 제거한다.
          • 제거되는 (와 짝인 셈이다.
      • 스택이 비워지면 전부 다 짝을 지어주었다는 것이므로 올바른 괄호의 조건이 된다.
      • 📢 주의사항! 스택이 비워져있을 때 Pop 하려 하면 런타임 에러가 발생한다. 처음부터 )가 나온 경우나 ()) 이런 경우의 세 번째 문자인 )가 그러할 것이다. 따라서 Pop은 스택이 비어있지 않을 때만 해야 한다.
    • 2️⃣ ( ) 각각 개수 카운팅 하기
      • 스택이 비었는지만으로 올바른 괄호 조건을 판단하기엔 부족하다. (와 )의 개수도 카운팅 해야 한다. 0이 아니면서 맞아 떨어져야 한다.
        • ))() 이런건 1️⃣만 따졌을 땐 올바른 괄호가 된다. ))은 스택이 비어있는 상태일테니 Pop이 되지 않고 무시되기 떄문이디ㅏ. 결론적으로 스택이 비어질테니 올바른 괄호라고 잘못 판단될 수 있다. 따라서 개수도 카운팅 하고 이 둘의 개수가 같은지도 따져야 한다.


🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기

Programmers 카테고리 내 다른 글 보러가기

댓글 남기기