문제
https://www.acmicpc.net/problem/4949
4949번: 균형잡힌 세상
하나 또는 여러줄에 걸쳐서 문자열이 주어진다. 각 문자열은 영문 알파벳, 공백, 소괄호("( )") 대괄호("[ ]")등으로 이루어져 있으며, 길이는 100글자보다 작거나 같다. 입력의 종료조건으로 맨 마
www.acmicpc.net
풀이
초반부터 설계를 제대로 하고 풀지 않아서 오래 걸렸다.
쉽게 금방 풀릴줄알아서 바로 코드에 들어간 게 문제였다.
신경 써야 할 점은
1. 공백 또한 입력받아야 한다. (string 헤더의 getline() 사용 필요 )
2. 스택의 경우의 수를 모두 생각 -> ')' or ']'가 등장하였을 때 스택에 문자가 있긴 한지, 있다면 그사이 문자열 또한 균형이 잡혀있는지 판단하여야 한다.
코드
#include<iostream>
#include<vector>
#include<queue>
#include<string>
#include<stack>
using namespace std;
string arr;
stack<char> st;
vector<bool> result;
int main() {
while (1) {
bool flag = false;
//<srting> 헤더의 getline()을 활용한 공백문자 입력 포함 , 개행(enter)까지 문자를 받음
getline(cin, arr);
if (arr.size() == 1 && arr[0]=='.') break; //종료조건
for (int i = 0; i < arr.size(); i++) {
if (arr[i] == '(' || arr[i] == '[') st.push(arr[i]);
if (!st.empty()) {
if (arr[i] == ')' && st.top() == '(') {
st.pop();
}
else if (arr[i] == ']' && st.top() == '[') {
st.pop();
}
else if (arr[i] == ')' && st.top() != '(') {
flag = true;
break;
}
else if (arr[i] == ']' && st.top() != '[') {
flag = true;
break;
}
}
else { //비었을때
if (arr[i] == ')' || arr[i] == ']') {
flag = true;
break;
}
}
}
if (st.size() == 0 && flag == false) result.push_back(true);
else result.push_back(false);
//다음을 위해 스택,문자열비우기
while (!st.empty()) {
st.pop();
}
arr.clear();
}
for (int j = 0; j < result.size(); j++) {
if (result[j] == true) cout << "yes" << endl;
else cout << "no" << endl;
}
return 0;
}
'알고리즘 공부 > 백준' 카테고리의 다른 글
[백준] 수 정렬하기 3 (10989/C++) (0) | 2022.01.23 |
---|---|
[백준] 나이순 정렬 (10814/C++) (0) | 2022.01.22 |
[백준] 설탕 배달 ( 2839 / C++) (0) | 2022.01.20 |
[백준] 나무 자르기 (2805/C++) (0) | 2022.01.16 |
[백준] 블랙잭 (2798 / C++) (0) | 2022.01.16 |