https://www.acmicpc.net/problem/4949
저번에 풀었던 파싱 문제와 비슷한데, ()외에 []의 유효성도 검토해야 한다.
이건 기본적인 논리가 같아서 어렵지 않는데, 입력을 받는 과정이 오히려 신경쓰였다.
아래와 같은 입력 조건 중에
하나 또는 여러줄에 걸쳐서 문자열이 주어진다. 각 문자열은 영문 알파벳, 공백, 소괄호("( )") 대괄호("[ ]")등으로 이루어져 있으며, 길이는 100글자보다 작거나 같다.
여러줄에 걸쳐서 문자열이 주어진다고 해서, getline()후에 끝이 ','인지를 확인하고, 아니면 다음줄을 concatenate하는 과정을 거쳐야 했다.
글자 제한을 준 걸 보면 입력받을 때 배열을 이용해서 참고하라는 거 같은데, 난 배열을 이용하지 않고 그냥 string을 사용했다.
#include <iostream>
#include <string>
#include <stack>
#include <vector>
using namespace std;
// 해당 문자열이 균형이 잡혔는지 확인하는 함수
int checkParse(string str) {
// parse string
stack<char> s;
for (int i = 0; i < str.length(); i++) {
/*
만약 (이면 stack에 넣는다.
)이면 스택 탑이 (인지 확인
a. ( 이 아니거나, empty이면 push
b. (이면 pop
만약 [이면 stack에 넣는다.
]이면 스택 탑이 [인지 확인
a. [ 이 아니면 push
b. [이면 pop */
if (str[i] == '(') {
s.push('(');
}
else if (str[i] == ')') {
if (s.empty() || s.top() != '(') {
s.push(')');
}
else {
s.pop();
}
}
else if (str[i] == '[') {
s.push('[');
}
else if (str[i] == ']') {
if (s.empty() || s.top() != '[') {
s.push(']');
}
else {
s.pop();
}
}
}
if (s.empty()) {
return 1;
}
else {
return 0;
}
}
int main(void) {
vector<string> inputs;
// 입력을 계속 받다가 "."을 받으면 입력받기를 멈춘다.
while (1) {
string str;
getline(cin, str);
if (str == ".") {
break;
}
// 만약 str의 끝이 . 이 아니었다면 다음줄을 이어붙인다.
while (str[str.length() - 1] != '.') {
string tmp;
getline(cin, tmp);
str = str + tmp;
}
inputs.push_back(str);
}
for (int i = 0; i < inputs.size(); i++) {
//cout << inputs[i] << endl;
if (checkParse(inputs[i])) {
cout << "yes" << endl;
}
else {
cout << "no" << endl;
}
}
}
'컴퓨터기본 > 문제풀이' 카테고리의 다른 글
Segmentation Fault (0) | 2021.08.23 |
---|---|
[백준] 11729. 하노이 탑 이동 순서 (0) | 2021.08.21 |
[백준] 9012번: 괄호 (0) | 2021.08.07 |
[백준] 1152번: 단어의 개수 (0) | 2021.06.30 |
[백준] 1157: 단어 공부 (0) | 2021.06.27 |