
문제 설명
https://www.acmicpc.net/problem/4949
4949번: 균형잡힌 세상
하나 또는 여러줄에 걸쳐서 문자열이 주어진다. 각 문자열은 영문 알파벳, 공백, 소괄호("( )") 대괄호("[ ]")등으로 이루어져 있으며, 길이는 100글자보다 작거나 같다. 각 줄은 마침표(".")로 끝난다
www.acmicpc.net
어떤 문자열이 주어졌을 때, 괄호들의 균형이 잘 맞춰져 있는지 판단하기
- 모든 "(" 는 ")"와만 짝을 이루어야 함
- 모든 "[" 는 "]"와만 짝을 이루어야 함
- 모든 오른쪽 괄호들은 자신과 짝을 이룰 수 있는 왼족 괄호가 존재
- 모든 괄호의 짝은 1 : 1 매칭이 가능함
- 짝을 이루는 두 괄호가 있을 때, 그 사이에 있는 문자열도 균형이 잡혀야 함
문제 풀이법
stack을 사용하면 된다
"["이나 "("이 들어오면 stack에 push,
"]"이나 ")"이 들어오면, stack이 비어있는지 확인, stack의 top이 자신의 짝과 맞는지 확인 후에 pop을 한다
만일
- "]", ")"이 들어왔을 때 stack이 비어있는 경우
- "]", ")"이 들어왔을 때, stack의 top이 자신의 짝과 다른 경우
- 문자열을 다 돈 후, stack이 비어있지 않는 경우
이런 경우에는 균형이 잡히지 않았으니 no를 출력한다
소스 코드
#include <iostream>
#include <stack>
using namespace std;
int main()
{
while (1)
{
string str;
getline(cin, str);
if (str == ".")
break;
stack<char> s;
bool flag = true;
for (int i = 0; i < str.size(); i++)
{
if (str[i] == '[' || str[i] == '(')
s.push(str[i]);
else if (str[i] == ']' || str[i] == ')')
{
if (s.empty())
{
flag = false;
break;
}
if (str[i] == ']')
{
if (s.top() != '[')
{
flag = false;
break;
}
s.pop();
}
else if (str[i] == ')')
{
if (s.top() != '(')
{
flag = false;
break;
}
s.pop();
}
}
}
if (!s.empty())
flag = false;
if (flag == true)
printf("yes\n");
else
printf("no\n");
}
return 0;
}
'Algorithm Study' 카테고리의 다른 글
[백준] 9012 괄호 (0) | 2023.01.20 |
---|---|
[백준] 3986 좋은 단어 (0) | 2023.01.19 |
[백준] 5430 AC (0) | 2023.01.18 |
[백준] 1021 회전하는 큐 (0) | 2023.01.17 |
[백준] 10866 덱 (0) | 2023.01.17 |