문제 설명
괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(Valid PS, VPS)이라고 부른다. 한 쌍의 괄호 기호로 된 “( )” 문자열은 기본 VPS 이라고 부른다. 만일 x 가 VPS 라면 이것을 하나의 괄호에 넣은 새로운 문자열 “(x)”도 VPS 가 된다. 그리고 두 VPS x 와 y를 접합(concatenation)시킨 새로운 문자열 xy도 VPS 가 된다. 예를 들어 “(())()”와 “((()))” 는 VPS 이지만 “(()(”, “(())()))” , 그리고 “(()” 는 모두 VPS 가 아닌 문자열이다.
여러분은 입력으로 주어진 괄호 문자열이 VPS 인지 아닌지를 판단해서 그 결과를 YES 와 NO 로 나타내어야 한다.
입력
입력 데이터는 표준 입력을 사용한다. 입력은 T개의 테스트 데이터로 주어진다. 입력의 첫 번째 줄에는 입력 데이터의 수를 나타내는 정수 T가 주어진다. 각 테스트 데이터의 첫째 줄에는 괄호 문자열이 한 줄에 주어진다. 하나의 괄호 문자열의 길이는 2 이상 50 이하이다.
출력
출력은 표준 출력을 사용한다. 만일 입력 괄호 문자열이 올바른 괄호 문자열(VPS)이면 “YES”, 아니면 “NO”를 한 줄에 하나씩 차례대로 출력해야 한다.
문제풀이
'(' 과 ')'가 제대로 짝 지어지는 문자열을 VPS라고 하기때문에 stack을 통해 문자열에 캐릭터들을 관리한다.
'('면 push하고 ')'면 우선 비어있는지 확인한 뒤, top이 '('면 pop하고 아니면 push 하고 flag=1로 설정한다.
그리고 for문이 끝난 뒤 stack이 비어있으면 VPS이므로 YES를 아니면 NO를 출력한다.
코드
#include <iostream>
#include <stack>
using namespace std;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int T,flag;
cin >> T;
while (T--)
{
string VPS;
stack<char>stk;
flag = 0;
cin >> VPS;
for (int i = 0; i < VPS.length(); i++)
{
if (VPS[i] == '(')
{
stk.push(VPS[i]);
}
else if (VPS[i] == ')')
{
if (!stk.empty() && stk.top()=='(')
{
stk.pop();
}
else
{
stk.push(VPS[i]);
flag = 1;
}
}
}
if (stk.empty() && flag==0)
{
cout << "YES\n";
}
else
{
cout << "NO\n";
}
}
}
배운점
stack과 같은 자료구조 stl을 사용하면서 back() called on empty deque 에러를 마주한 경우가 몇 번 있었다.
제대로 인식안하고 코드를 수정하다가 옳은 출력이 나온 경우가 많아서
원인을 제대로 따지지 못했는데 이번에 알게되었다!
나같은 경우는 처음에 VPS[i] == ')' 인 부분에서 if (stk.top()=='(' && !stk.empty()) 라는 조건문을 작성했었다.
하지만 이 조건문이 잘못되어서 해당 에러가 발생한 것이다.
만약에 예시가 ()) 이렇게 들어왔다면 ()는 짝이 맞아 pop 되어있고,
)가 들어오는 순간 stack은 비어있기 때문에 stk.top()은 에러가 발생한다.
따라서 stl의 함수를 사용하고 싶은 경우 empty()인지 아닌지를 먼저 판단한 뒤
함수를 사용해야 해당 에러가 안생김을 알 수 있었다.
이후 !stk.empty()를 확인 하고 stk.top()을 확인해 에러를 해결하였다.
'알고리즘 > 문제풀이 (C++,Kotlin)' 카테고리의 다른 글
[BOJ/C++] 2178번 미로 : BFS 거리 측정 (0) | 2023.01.13 |
---|---|
[BOJ/C++] 1926번 그림 : BFS (0) | 2023.01.12 |
[BOJ/C++] 3986번 좋은단어 (0) | 2023.01.10 |
[BOJ/C++] 4949번 균형잡힌 세상 (0) | 2023.01.09 |
[BOJ/C++] 10814번 나이순 정렬 (0) | 2023.01.07 |