[ 장르 ] String && Stack
[ 문제 ]
- My Code
// 괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열
// 괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(Valid PS, VPS)
#include <iostream>
#include <string>
#include <stack>
using namespace std;
int main()
{
cin.tie(NULL); cout.tie(NULL); ios_base::sync_with_stdio(false);
int n;
string str; // 괄호 문자열
stack<char> stack; // 괄호문자열 받을 스택
cin >> n;
int i = 0,j;
while (i < n)
{
cin >> str;
if (str.length() % 2 != 0) // 문자열받은 괄호의 수가 애초에 홀수개이면 VPS가 아님
cout << "NO" << '\n'; // NO 출력
else // 괄호 수가 일단 맞으면
{
for (j = 0; j < str.size(); j++) // 문자열 수만큼 반복
{
if (str[j] == '(') // 여는 괄호면 스택에 넣고
stack.push('(');
else
{ // 닫는 괄호면 가장 안쪽 여는괄호 스택에서 pop, 짝꿍
if (!stack.empty()) { stack.pop(); } // 단, 스택에 여는 괄호가 있는경우만
else { break; } // 스택에 여는 괄호없는데, 현재 닫는 괄호가 들어왔다면 VPS가 아님
}
}
if (j == str.size() && stack.size() == 0) // 괄호문자열 끝까지 조회했고, 여는 괄호스택도 다 쓴거면
cout << "YES" << '\n'; // VPS 맞음
else
cout << "NO" << '\n'; // 아니면 VPS 아님
}
while (!stack.empty()) // 한 차례마다 끝나면, 여는괄호 스택 비우기
stack.pop();
i++;
}
return 0;
}
" 매 단계, 여는 괄호 스택을 비워줘야합니다. "
[ CheckPoint ]
- 문제를 읽어보면 딱 "스택" 문제라는걸 느낄 수 있을 것이다.
- 내 풀이 Point는 아래 부분이다.
문자열 끝까지 탐색을 했고, 그 때 여는 괄호 스택도 비어있을경우( 전부 사용한 경우 ) => VPS 가 맞음
문자열 끝까지 탐색은 했는데, 여는 괄호 스택에 아직 데이터가 있는 경우( 여는 괄호가 남아있는 경우 ) => VPS 가 아님
728x90
반응형
'Algorithm Practice > [ Baekjoon ]' 카테고리의 다른 글
[Baekjoon][#1927] 최소 힙 (0) | 2020.09.25 |
---|---|
[Baekjoon][#1920] 수 찾기 (0) | 2020.09.25 |
[Beakjoon][#1021] 회전하는 큐 (0) | 2020.09.25 |
[Baekjoon][#10866] 덱(Deque) (0) | 2020.09.24 |
[Baekjoon][#11729] 하노이 탑 이동순서 (0) | 2020.09.23 |