
괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다. 예를 들어
- "()()" 또는 "(())()" 는 올바른 괄호입니다.
- ")()(" 또는 "(()(" 는 올바르지 않은 괄호입니다.
'(' 또는 ')' 로만 이루어진 문자열 s가 주어졌을 때, 문자열 s가 올바른 괄호이면 true를 return 하고, 올바르지 않은 괄호이면 false를 return 하는 solution 함수를 완성해 주세요.
| s | answer |
|---|---|
| "()()" | true |
| "(())()" | true |
| ")()(" | false |
| "(()(" | false |
입출력 예 #1,2,3,4
문제의 예시와 같습니다.
🔥 문제 요약:
문자열에 괄호를 입력 받아서 ( ) 쌍이 이뤄지는 지 확인해서 올바른 괄호인지 판단하는 문제
🤔 생각할 점
스택을 사용해서 들어온 문자열이 ( 인 경우에 스택에 넣어주고 ) 인 경우에는 스택에 넣지 않는다.
( 인 경우에만 스택에 push) 인 경우에는 스택이 비어있는지 확인 스택이 비어있다면 이전 괄호가 ) 였다는 걸 의미한다. ( 보다 ) 가 많아졌으니 올바르지 않은 괄호이기 때문에 false를 return 스택이 비어있지 않다면 전 괄호가 ( 였다는 걸 의미하니까 () 올바른 괄호가 성립했으니 pop으로 다시 비워준다.#include <iostream>
#include<string>
#include<stack>
using namespace std;
bool solution(string s)
{
stack<char> str;
for(char& c : s)
{
if(c=='(')
{
str.push(c);
}
else if(c==')')
{
if(str.empty())
{
return false;
}
else
{
str.pop();
}
}
}
return str.empty();
}
✅ 문자열 S의 각 문자 마다 검사
for(char& c : s)
✅ ( 가 들어오면 스택에 해당 문자를 넣어준다.
if(c=='(')
{
str.push(c);
}
✅ ) 가 들어왔을 때 스택이 비어있다면 (가 들어오지 않았다는 뜻→ 올바르지 않은 괄호
비어있지 않다면 올바른 괄호니까 스택을 비워줌
else if(c==')')
{
if(str.empty())
{
return false;
}
else
{
str.pop();
}
}
✅ 스택이 비어있는지 여부를 반환 ( 비어있다면 올바른 괄호인 것이다.)