문제 https://www.acmicpc.net/problem/4949
풀이
백준 9012번 문제와 유사하지만 이 문제는 (), [] 2개의 괄호가 있고,
각 괄호가 감싸는 문자열 또한 짝이 맞아야 한다. ([abc)]와 같은 경우는 안 된다.
따라서 현재 스택의 맨 위에 있는 괄호가 ( 인지 [ 인지 확인하는 것이 필요하다.
1) 괄호를 입력받으면 스택에 추가한다.
2) 닫는 괄호이면서, 스택이 비어있지 않고, '입력받은 괄호 == 스택의 top에 있는 괄호'라면 스택에서 pop 한다.
3) 닫는 괄호인데 스택이 비어있거나 입력받은 괄호와 짝이 맞지 않다면 false.
4) 문자열의 끝까지 돈 후, 스택이 비어있고 flag가 true라면 true.
코드
#include <iostream>
#include <stack>
#include <string>
using namespace std;
bool balance(string str)
{
stack<char> s;
bool flag = true;
for(int i=0; i<str.length()-1; i++)
{
if(str[i]=='(') s.push(str[i]);
else if(!s.empty() && str[i] ==')' && s.top()=='(') s.pop();
else if((s.empty()||s.top()!='(') && str[i] ==')') flag = false;
else if(str[i]=='[') s.push(str[i]);
else if(!s.empty() && str[i] ==']' && s.top()=='[') s.pop();
else if((s.empty() || s.top()!='[') && str[i] ==']') flag = false;
}
if(s.empty() && flag == true) return true;
else return false;
}
int main()
{
string str;
while(1)
{
getline(cin,str);
if(str==".") break;
if(balance(str)) cout<<"yes"<<'\n';
else cout<<"no"<<'\n';
}
}
'알고리즘 > 문제 풀이' 카테고리의 다른 글
백준 1065 - 한수 (0) | 2022.03.19 |
---|---|
백준 1158 - 요세푸스 문제(C++) (0) | 2022.03.12 |
백준 10816 - 숫자 카드 2 (0) | 2022.02.23 |
백준 1920 - 수 찾기 (0) | 2022.02.19 |
백준 9012 - 괄호 (0) | 2022.02.16 |