문제 : 짝이 맞지 않은 괄호 (난이도 : 下)
분석
Stack의 구조인 LIFO(Last In First Out)를 안다면 쉽게 접근할 수 있는 문제이다.
짝이 맞는지 확인하는 함수 wellMatched()에서 짝을 맞추는 과정을 유의 깊게 봐보자.
(주석 참조)
구현
bool wellMatched(const string& input)
{
// opening과 closing의 문자 순서를 유심히 보자.
// idx로 짝을 맞추기에 같은 순서로 선언됐다.
const string opening("({["), closing(")}]");
stack<char> openStack;
for (int i = 0; i < input.size(); i++)
{
// find() 함수는 일치하는 idx를 반환한다.
// 만약 일치하는 값이 없으면 string::npos를 반환한다.
// npos는 -1 값이다.
if (opening.find(input[i]) != -1)
{
openStack.push(input[i]);
}
else
{
if (openStack.empty()) return false;
if (opening.find(openStack.top()) != closing.find(input[i]))
{
return false;
}
// 짝을 맞춘경우 pop
openStack.pop();
}
}
// 짝을 다 맞추고 스택이 비어야 성공
return openStack.empty();
}
int main()
{
int c;
cin >> c;
while (c--)
{
string input;
cin >> input;
if (wellMatched(input)) cout << "Yes" << '\n';
else cout << "No" << '\n';
}
return 0;
}
'알고리즘 > 알고리즘 문제 해결 전략' 카테고리의 다른 글
알고스팟 - 트리 순회 순서 변경 (0) | 2021.01.10 |
---|---|
알고스팟 - 외계 신호 분석 (0) | 2021.01.09 |
연결 리스트 - 조세푸스 문제 (0) | 2021.01.07 |
동적 계획법 - 13. 두니발 박사의 탈옥 (0) | 2021.01.06 |
동적 계획법 - 12. 폴리오미노 & 메모이제이션 (0) | 2021.01.05 |