[C++로 풀이] 올바른 괄호 ⭐⭐
카테고리: Programmers
태그: Coding Test Algorithm
📌 올바른 괄호
난이도 ⭐⭐
🚀 문제
🚀 내 풀이 ⭕
#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이 되지 않고 무시되기 떄문이디ㅏ. 결론적으로 스택이 비어질테니 올바른 괄호라고 잘못 판단될 수 있다. 따라서 개수도 카운팅 하고 이 둘의 개수가 같은지도 따져야 한다.
- 스택이 비었는지만으로 올바른 괄호 조건을 판단하기엔 부족하다. (와 )의 개수도 카운팅 해야 한다. 0이 아니면서 맞아 떨어져야 한다.
- 1️⃣ 문자열
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
댓글 남기기