728x90
출처
https://www.acmicpc.net/problem/4949
내 풀이
#include<iostream>
#include<deque>
#include<string>
using namespace std;
//true면 무조건 no
bool Check_No = false;
deque<char>dq;
int big_ = 0; //[
int small_ = 0; //(
int main()
{
while (true)
{
//한줄씩 문자열을 입력받는다.
string input;
getline(cin, input);
//만일 입력받은 문자열이 .면 종료
if (input == ".")
{
break;
}
//괄호가 있으면 데큐에 넣어줌
for (int i = 0; i <= input.length(); i++)
{
if (input[i] == '(')
{
small_++;
dq.push_back('(');
}
else if (input[i] == ')')
{
small_--;
// (이 안나왔다는 거니 종료시키고 no 출력
if (small_ < 0)
{
Check_No = true;
continue;
}
//만일 dq비교중 열린 괄호가 서로 다르면 no 출력
if (dq.back() == '[') Check_No = true;
if (!dq.empty()) dq.pop_back();
}
else if (input[i] == '[')
{
big_++;
dq.push_back('[');
}
else if (input[i] == ']')
{
big_--;
// (이 안나왔다는 거니 종료시키고 no 출력
if (big_ < 0)
{
Check_No = true;
continue;
}
//만일 dq비교중 열린 괄호가 서로 다르면 no 출력
if (dq.back() == '(') Check_No = true;
if (!dq.empty()) dq.pop_back();
}
}
//0보다 크다는건 괄호가 짝지어지지 않았다는 거임
if (Check_No || small_ > 0 || big_ > 0)
{
cout << "no" << endl;
}
else cout << "yes" << endl;
//초기화
small_ = 0;
big_ = 0;
Check_No = false;
dq.clear();
}
}
해설
데큐를 이용하여 괄호들을 비교해주었다.
소괄호 대괄호가 서로 짝을 이루는지, 닫힌 괄호먼저 나오지 않았는지 괄호가 대칭이 되는지 등을
확인하여 yes no를 출력해주었다.
느낀점
다른 사람은 스택으로 풀었던데 다음 복습할땐 스택으로 풀어봐야겠다.
getline(cin,input)
'백준 코딩테스트 > 실버' 카테고리의 다른 글
1620) 나는야 포켓몬 마스터 이다솜 (C++) (0) | 2022.05.15 |
---|---|
14425) 문자열 집합 (C++) (0) | 2022.05.11 |
1021) 회전하는 큐 (C++) (0) | 2022.05.09 |
11650) 좌표 정렬하기 (C++) (0) | 2022.05.09 |
1427) 소트인사이드 (C++) (0) | 2022.05.08 |