#include "bits/stdc++.h"
using namespace std;
stack<char> s;
bool IsBalanced(string input)
{
while (!s.empty())
{
s.pop();
}
for (char ch : input)
{
if (ch == '(' || ch == '{' || ch == '[' || ch == ')' || ch == '}' || ch == ']')
{
if (s.size() == 0)
{
s.push(ch);
}
else
{
if (ch-s.top()==2 || ch - s.top() == 1)
{
s.pop();
}
else
{
s.push(ch);
}
}
}
}
return s.size()==0;
}
int main() {
vector<string> stringVector;
string input;
while (true)
{
getline(cin, input);
stringVector.push_back(input);
if (input == ".")
{
break;
}
}
for(string str : stringVector)
{
if (str == ".")
{
continue;
}
if (IsBalanced(str))
{
cout << "yes"<<endl;
}
else
{
cout << "no"<<endl;
}
}
return 0;
}
이번에도 스택을 이용해 괄호를 검사하는 문제였습니다.
이전에 풀었던 괄호검사 문제와의 차이점은 이번엔 중괄호, 대괄호등 종류가 다양해졌다는 점입니다.
처음엔 burte force로 모든 케이스에 대해서 if문을 이용해서 검사하려는 아이디어를 가졌지만
좀 더 좋은 방법이 있을것이라는 생각에 고민중 ASCII코드를 이용하는 방법을 생각했습니다.
ASCII코드 상에서 소괄호의 경우는 차이가 1이고 대괄호, 중괄호의 경우엔 2였습니다.
이부분을 이용해 괄호를 명확하게 검사해냈습니다.
또 추가해볼만한 점은 처음에 풀땐 stack을 전역으로 선언하고 함수에 들어올때마다 while을 이용해 정리해줬는데
그냥 함수안에 지역변수로 선언하는 것이 좀 더 좋은 풀이었다고 생각이 듭니다.
'코딩테스트' 카테고리의 다른 글
[백준] 2636 치즈 (0) | 2025.07.02 |
---|---|
[백준] 14502 연구소 (0) | 2025.07.01 |
[백준] 9012 괄호 (0) | 2025.05.30 |
[백준] 1436 영화감독 숌 (0) | 2025.05.30 |
[백준] 2852 NBA 농구 (0) | 2025.05.17 |