티스토리 뷰

Algorithm/BOJ

백준 9012번 C++

poopooreum 2023. 8. 23. 14:35
반응형

백준 9012번 괄호
https://www.acmicpc.net/problem/9012

9012번: 괄호

괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(Valid PS, VPS)이라고

www.acmicpc.net


정답 코드

#include<iostream>
#include<stack>
#include<string>
using namespace std;
int find(string a) {
	stack<char>s;
	for (int x = 0; x < a.length(); x++) {
		if (a[x] == '(')
			s.push(a[x]);
		else if (a[x] == ')') {
			if (s.empty() == 1) {
				return 0;
			}
			else if (s.top() == '(')
				s.pop();
			else if (s.top() != '(') {
				return 0;
			}
		}
	}
	if (s.empty() == 1)
		return 1;
	else
		return 0;
}
int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int n;
	cin >> n;
	for (int x = 0; x < n; x++) {
		string input;
		cin >> input;
		int a=find(input);
		if (a == 0)
			cout << "NO" << endl;
		else
			cout << "YES" << endl;
	}
}



문제 풀이
먼가 처음에는 어려워보였는데 너무 생각을 깊게 했던 문제입니다. string으로 입력을 받고 find함수로 보냈습니다. 0을 리턴하면 No를 출력, 그게 아니라면 yes를 출력하도록 했습니다.
문제를 읽어보니 들어온 괄호를 삭제를 시켜야하고
나중에 들어온것부터 빼야해서 LIFO특성을 가진 스택을 사용했습니다. 문자열 길이만큼 반복문을 돌리고 경우의 수를 크게 두 가지로 나누었습니다.

첫째, a[x]가 '('인 경우
이 경우에는 계속 스택에 push연산을 해줍니다.
vps가 될 가능성이 있으므로 push를 해야 합니다.
둘째, a[x]가 ')'인 경우
이 안에서 s.top()이 '('인 경우와 ')'인 경우로 나누기
첫 번째는 pop을 해주고 두 번째는 함수를 종료합니다.
그리고 스택이 비어있는 경우로 나누었습니다.
이 경우에도 함수를 종료합니다.
그래서 s.empty()가 1이면 스택을 모두 정리후 비운 것이기 때문에 1을 리턴하고, 그게 아니라면 0을 리턴

반응형

'Algorithm > BOJ' 카테고리의 다른 글

백준 9063번 C++  (0) 2023.08.23
백준 9020번 C++  (0) 2023.08.23
백준 8958번 C++  (0) 2023.08.23
백준 8437번 파이썬  (0) 2023.08.23
백준 8393번 C++  (0) 2023.08.23
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함