백준 9012 c++
https://www.acmicpc.net/problem/9012
9012번: 괄호
괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(Valid PS, VPS)이라고
www.acmicpc.net
#include <iostream>
#include <string>
#include <stack>
using namespace std;
int main(void) {
int k;
cin >> k;
while (k > 0) {
k--;
string input;
cin >> input;
stack<char> st;
string answer = "YES";
for (int i = 0; i < input.length(); i++) {
//'('는 스택에 저장
if (input[i] == '(') {
st.push(input[i]);
}
//')'가 나오면 스택에 저장된 '('와 짝이 맞는지 확인하고 pop
else if (!st.empty() && input[i] == ')' && st.top() == '(') {
st.pop();
}
//위의 경우를 제외하고는 모두 vps가 아닌 상황이므로 종료(break)
else {
answer = "NO";
break;
}
}
//'('와 ')'가 짝이 안 맞는 경우 '('가 모두 pop되지 않기 때문에
// 스택이 비지 않는다. 따라서 이 경우는 vps가 아니므로 "NO"
if (!st.empty()) answer = "NO";
cout << answer << endl;
}
return 0;
}
코드해석
루프를 반복을 몇번을 할 건지 일단 k 로 초기화를 해주자..
여기서 k는 몇번 테스트를 돌릴건지 횟수를 선택해주는 거야.
그다음, while문으로 루프를 만들어.
루프 내에서 input입력 스트림에서 문자열을 읽어줘.
stack<char> st;
라는 st의 스택을 선언해줘. 여기다가 괄호를 저장할거야.
answer변수를 "YES"로 초기화해줘.
for루프 문을 사용하여 k가 0이 될때 까지 반복해줘.
현재 문자가 '('이면 스택으로 푸시하고
현재 문자가 ')'인 동시에 ,스택이 비어 있지 않고 ,스택의 맨 위가 '(' 로 일치하는 쌍인지 확인해줘.
성립한다면, 스택에서 '('를 팝해줘.
아닐경우 answer를 "NO" 르 변경하고 루프를 중단해줄거야.
현재 문자가 '('도 ')'도 아니면 else로 처리해서 answer"NO"로 설정하고 루프를 중단해줄거야.
모든 문자를 반복한 후 스택에 '('가 남아 있는지 empty로 확인할거야.
있는 경우 를 answer"NO"로 설정해주고.
answer를 출력해줘.
프로그램은 0을 반환하며 종료될거야.