https://www.acmicpc.net/problem/4949
https://velog.io/@jxlhe46/백준-9012번.-괄호
전에 풀었던 이 문제와 비슷한데, 소괄호에 대괄호까지 추가되었기 때문에 괄호의 종류에 따라 짝이 맞는지도 확인해줘야 한다. 그것을 isCouple 함수로 구현해주었다.
#include<iostream>
#include<string>
#include<stack>
using namespace std;
bool isCouple(char a, char b) {
if (a == '(' && b == ')')
return true;
else if (a == '[' && b == ']')
return true;
else
return false;
}
bool isBalance(string str) {
stack<char> s;
for (int i = 0; i < str.size(); i++) {
char ch = str[i];
// 여는 괄호는 스택에 push
if (ch == '(' || ch == '[') {
s.push(ch);
}
// 닫는 괄호가 들어왔을 때
else if (ch == ')' || ch == ']') {
if (!s.empty()) {
// 스택의 top에 있는 열린 괄호와 짝이 맞으면
if (isCouple(s.top(), ch)) {
s.pop(); // 열린 괄호 pop
}
else { // 짝이 안 맞으면 false
return false;
}
}
else { // 스택이 비어있으면 false
return false;
}
}
}
// 반복문이 끝난 뒤 스택에 남은 괄호가 없으면 true
return s.empty();
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
string str;
while (true) {
// 엔터를 기준으로 한줄씩 입력 받기
getline(cin, str);
// 점 하나만 입력된 경우 프로그램 종료
if (str.size() == 1 && str[0] == '.')
break;
if (isBalance(str)) cout << "yes\n";
else cout << "no\n";
}
return 0;
}
처음에 점(.)을 문자열의 끝을 나타내는 구분자로 이해해서 getline(cin, str, '.') 이렇게 입력을 받았는데, 이렇게 하면 while 루프를 종료시킬 수가 없다.
엔터를 기준으로 한줄씩 입력을 받고, 점(.)이 하나만 입력되면 while 루프를 종료시키는 방식으로 코드를 짜야 한다.