반응형
https://www.acmicpc.net/problem/4949
4949번: 균형잡힌 세상
각 문자열은 마지막 글자를 제외하고 영문 알파벳, 공백, 소괄호("( )"), 대괄호("[ ]")로 이루어져 있으며, 온점(".")으로 끝나고, 길이는 100글자보다 작거나 같다. 입력의 종료조건으로 맨 마지막에
www.acmicpc.net
#문제 간단 정리
흔한 괄호문제의 응용
스택을 활용한다.
#문제 해결 방법
스택을 활용해 괄호일 경우 스택에 넣어주고
같은 괄호일경우에 pop
비어있는 경우나 괄호가 닫는괄호가 아닐경우 오답으로 간주,
수많은 스택 활용 괄호 문제중에 하나이다.
getline 으로 한줄 전체를 읽어오는 것을 활용하자
그리고 가독성좀 생각해야겠다..
#전체 코드
#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>
#include <map>
#include <string>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
vector<string> lines;
vector<bool> answers;
while (true) {
string input;
getline(cin, input);
if (input == ".") {
break;
}
vector<char> brackets;
bool flag = true;
for (int i = 0; i < input.size(); i++) {
if (input[i] == '(') {
brackets.push_back('(');
}
else if (input[i] == ')') {
if (brackets.empty()) {
flag = false;
break;
}
else if (brackets.back() == '(') {
brackets.pop_back();
}
else if (brackets.back() != '(') {
flag = false;
break;
}
}
else if (input[i] == '[') {
brackets.push_back('[');
}
else if (input[i] == ']') {
if (brackets.empty()) {
flag = false;
break;
}
else if (brackets.back() == '[') {
brackets.pop_back();
}
else if (brackets.back() != '[') {
flag = false;
break;
}
}
}
if (!brackets.empty()) {
flag = false;
}
if (flag) {
answers.push_back(true);
}
else {
answers.push_back(false);
}
}
for (bool a : answers) {
if (a == true) {
cout << "yes" << '\n';
}
else {
cout << "no" << '\n';
}
}
return 0;
}
리팩토링한 코드
#include <iostream>
#include <vector>
#include <map>
using namespace std;
// 괄호의 짝을 확인하는 함수
bool isValidBracketSequence(const string& input) {
vector<char> stack;
map<char, char> bracketPairs = {{')', '('}, {']', '['}};
for (char ch : input) {
if (ch == '(' || ch == '[') {
stack.push_back(ch);
} else if (ch == ')' || ch == ']') {
if (stack.empty() || stack.back() != bracketPairs[ch]) {
return false;
}
stack.pop_back();
}
}
return stack.empty();
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
vector<bool> answers;
string input;
while (true) {
getline(cin, input);
if (input == ".") break;
answers.push_back(isValidBracketSequence(input));
}
for (bool isValid : answers) {
cout << (isValid ? "yes" : "no") << '\n';
}
return 0;
}
반응형
'[백준] > C++' 카테고리의 다른 글
백준 1584번 게임 [C++] (0) | 2024.04.12 |
---|---|
백준 6126번 Cow Cash [C++] (0) | 2024.04.07 |
백준 2357번 최솟값과 최댓값 [C++] (0) | 2024.03.30 |
백준 1920번 수 찾기 [C++] (0) | 2024.03.24 |
백준 7579번 앱 [C++] (0) | 2024.03.20 |