백준 9012 문제풀이
in Computer Science on Algorithm
문제 링크
https://www.acmicpc.net/problem/9012
문제 설명
괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(Valid PS, VPS)이라고 부른다. 한 쌍의 괄호 기호로 된 “( )” 문자열은 기본 VPS 이라고 부른다. 만일 x 가 VPS 라면 이것을 하나의 괄호에 넣은 새로운 문자열 “(x)”도 VPS 가 된다. 그리고 두 VPS x 와 y를 접합(concatenation)시킨 새로운 문자열 xy도 VPS 가 된다. 예를 들어 “(())()”와 “((()))” 는 VPS 이지만 “(()(”, “(())()))” , 그리고 “(()” 는 모두 VPS 가 아닌 문자열이다. 여러분은 입력으로 주어진 괄호 문자열이 VPS 인지 아닌지를 판단해서 그 결과를 YES 와 NO 로 나타내어야 한다.
문제 분석
문제는 짝을 지어주는 것으로 해결한다. 문자열을 입력받아서 괄호의 짝을 찾아주는 것이 문제 해결의 핵심이다. “()()()()(“ 이러한 괄호가 들어온다면 NO를 출력해 주고, “()()()()”라는 문자열이 들어온다면 괄호의 모든 짝이 있으므로 POP으로 스택에서 제거해 주면 된다. 사실 벡터로도 풀 수 있을 거 같긴 한데 나는 스택을 이용해서 해결했다.
코드
#include<bits/stdc++.h>
using namespace std;
int n;
string s;
bool check(string s){
stack<char> stk;
for(char c : s){
if(c == '(') stk.push(c);
else{
if(!stk.empty()) stk.pop();
else return false;
}
}
return stk.empty();
}
int main(){
cin >> n;
for(int i = 0; i < n; i++){
cin >> s;
if(check(s)){
cout << "YES\n";
} else {
cout << "NO\n";
}
}
return 0;
}
실력이 점점 늘고 있다~~
Reference
나의 뇌