세계는 균형이 잘 잡혀있어야 한다. 양과 음, 빛과 어둠 그리고 왼쪽 괄호와 오른쪽 괄호처럼 말이다.
정민이의 임무는 어떤 문자열이 주어졌을 때, 괄호들의 균형이 잘 맞춰져 있는지 판단하는 프로그램을 짜는 것이다.
문자열에 포함되는 괄호는 소괄호("()") 와 대괄호("[]")로 2종류이고, 문자열이 균형을 이루는 조건은 아래와 같다.
정민이를 도와 문자열이 주어졌을 때 균형잡힌 문자열인지 아닌지를 판단해보자.
각 문자열은 마지막 글자를 제외하고 영문 알파벳, 공백, 소괄호("( )"), 대괄호("[ ]")로 이루어져 있으며, 온점(".")으로 끝나고, 길이는 100글자보다 작거나 같다.
입력의 종료조건으로 맨 마지막에 온점 하나(".")가 들어온다.
각 줄마다 해당 문자열이 균형을 이루고 있으면 "yes"를, 아니면 "no"를 출력한다.
이 문제는 괄호 문제와 유사하다. 그래서 괄호 문제를 푼 경험이 있다면 이 문제도 어렵지 않게 풀이할 수 있다.
이것도 스택의 개념을 이용해서 문제를 풀이하면 쉽게 문제를 해결할 수 있다.
괄호 문제의 풀이와 비슷하므로 해설을 쓸지 않겠다.
[백준] 9012번: 괄호 - c++
#include<bits/stdc++.h>
using namespace std;
string s;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
while(true) {
getline(cin, s);
if (s==".")
break;
stack<char> st;
for (char i : s) {
if (i=='[' || i=='(')
st.push(i);
if (i==')') {
if (st.empty() || st.top() != '(') {
st.push(i);
break;
}
if (st.top() == '(')
st.pop();
}
if (i==']') {
if (st.empty() || st.top() != '[') {
st.push(i);
break;
}
if (st.top() == '[')
st.pop();
}
}
if (st.empty())
cout << "yes\n";
else
cout << "no\n";
}
return 0;
}