https://www.acmicpc.net/problem/4949
4949번: 균형잡힌 세상
각 문자열은 마지막 글자를 제외하고 영문 알파벳, 공백, 소괄호("( )"), 대괄호("[ ]")로 이루어져 있으며, 온점(".")으로 끝나고, 길이는 100글자보다 작거나 같다. 입력의 종료조건으로 맨 마지막에
www.acmicpc.net
풀이 :
- 문자열에 괄호가 존재할 경우, 괄호가 서로 매칭되는지 확인
-> 스텍을 이용해 풀 수 있다
닫는 괄호가 나왔을 때 제일 위에 쌓여있는 괄호와 매칭되는지 확인
- 문자열 안에 공백이 존재하기 때문에 공백을 함께 입력받아야 한다
- 종료 조건은 '.'
코드 :
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
using namespace std;
int main(){
cin.tie(NULL);
ios::sync_with_stdio(false);
string s;
vector<char> v; //괄호를 저장할 벡터배열
bool ans; //정답 판별할 ans
while(1){ //일단 무한 반복
ans = true;
getline(cin, s, '.'); //공백까지 한 줄로 입력 받을 getline. 종료 조건은 .
if(s.size() == 0){ //.를 무시하고 입력 받기 때문에
break; //입력을 종료하기 위해 .가 하나 들어오면 s의 사이즈는 0이다
}
cin.ignore(); //getline에 쌓이는 개행 제거
for(int i=0; i<s.size(); i++){
if((s[i] == '(') || (s[i] == '[')){ //여는 괄호는 무조건 벡터에 저장
v.push_back(s[i]);
}else if(s[i] == ')'){
if((v.size() == 0) || (v.back() != '(')){ //벡터의 사이즈가 0인데 닫는 괄호가 나왔거나,
ans = false; //마지막 괄호와 매칭이 되지 않을 경우 false로 표시
break;
}else if(v.back() == '('){ //매칭이 된다면 벡터 마지막 괄호 삭제
v.pop_back();
}
}else if(s[i] == ']'){
if((v.size() == 0) || (v.back() != '[')){
ans = false;
break;
}else if(v.back() == '['){
v.pop_back();
}
}
}
if(v.size() > 0){ //여는 괄호와 닫는 괄호의 수가 맞지 않는 경우
ans = false;
}
(ans ? cout << "yes\n" : cout << "no\n");
v.clear();
s.clear();
}
}
'PS_Baekjoon' 카테고리의 다른 글
[백준 C++] 1417번 : 국회의원 선거 (1) | 2023.03.14 |
---|---|
[백준 C++] 2581번 : 소수 (0) | 2023.03.13 |
[백준 C++] 2563번 : 색종이 (0) | 2023.03.11 |
[백준 C++] 1912번 : 연속합 (0) | 2023.03.10 |
[백준 C++] 2628번 : 종이자르기 (1) | 2023.03.09 |