1. 문제
https://www.acmicpc.net/problem/4949
4949번: 균형잡힌 세상
각 문자열은 마지막 글자를 제외하고 영문 알파벳, 공백, 소괄호("( )"), 대괄호("[ ]")로 이루어져 있으며, 온점(".")으로 끝나고, 길이는 100글자보다 작거나 같다. 입력의 종료조건으로 맨 마지막에
www.acmicpc.net
2. 풀이 과정
입력받은 문자열을 한 글자씩 탐색한다.
(, [ 이면 스택에 무조건 push
), ] 일때 스택의 top과 괄호쌍을 이루는 경우에만 pop을 수행한다.
괄호쌍을 이루지 않는 경우엔 flag를 false로 하고 break; 한다.
1. 각 문자열은 마지막 글자를 제외하고 영문 알파벳, 공백, 소괄호("( )"), 대괄호("[ ]")로 이루어져 있다고 되있으니 getline(cin, str)로 한 문장을 입력받는다. str == "."인 경우에는 프로그램을 종료한다.
2. for문으로 문자열을 str[i] 하나씩 위 로직대로 탐색한다.
3. 탐색 후 flag가 false이거나 결론적으로 스택이 비어있지 않다면 no를 출력 아니면 yes출력
((( 같은 경우는 flag는 true이지만 쌍을 이루지않아 pop된 적이 없어 스택이 비어있지않음.
3. C++ 정답코드
#include <iostream>
#include <string>
#include <stack>
using namespace std;
int main()
{
while (1)
{
stack <char> s;
string str;
getline(cin, str);
if (str== ".") //.만 입력되면 종료한다.
return 0;
bool flag = true;
for (int i = 0; i < str.length(); i++) //한 문자씩 탐색 수행
{
if (str[i] == '(' || str[i] == '[') //여는 괄호일 경우 스택에 push
s.push(str[i]);
else if (str[i] == ')') //닫는 괄호인경우
{
if (!s.empty() && s.top() == '(') //스택 top이 대응되는 괄호이면 pop
s.pop();
else //아니라면 잘못된 문자열이므로 break
{
flag = false;
break;
}
}
else if (str[i] == ']')
{
if(!s.empty() && s.top() == '[')
s.pop();
else
{
flag = false;
break;
}
}
}
if (flag && s.empty())
cout << "yes";
else
cout << "no";
cout << '\n';
}
return 0;
}
'🏆 PS(Problem Solving) > Baekjoon' 카테고리의 다른 글
[C++] 백준 24511 queuestack (0) | 2024.05.08 |
---|---|
[C++] 백준 1406 에디터 (0) | 2024.04.05 |
[C++] 백준 1427 소트인사이드 (0) | 2024.03.11 |
[C++] 백준 2563 색종이 (0) | 2024.03.09 |
[C++] 백준 18870 좌표 압축 (1) | 2024.03.01 |