알고리즘 공부/백준

9012 괄호 by C++

당장하자 2022. 7. 2. 14:27

문제

https://www.acmicpc.net/problem/9012

 

해결한 방법

1. string으로 입력받아서 각 철자를 인덱싱해서 '('를 찾으면 left에 ')'를 찾으면 right에 1을 더한다.
2. 중간에 right가 left보다 커진다면 break후 NO출력
3. NO가 출력되지 않았다면 right와 left를 비교해서 같으면 YES 아니라면 NO 출력
#include <iostream> // cin, cout
#include <string> // string

int main()
{
	int t;
	cin >> t;
	cin.ignore();

	string buffer;
	int size = 0;
	while (t--){
		getline(cin, buffer);
		size = buffer.size();
		int left = 0, right = 0;
		int is_break = 0;
		for (int i = 0; i < size; i++){
			if (buffer[i] == '('){
				left++;
			}
			else {
				right++;
				if (right > left) {
					cout << "NO" << endl;
					is_break = 1;
					break;
				}
			}
		}
		if (is_break)
			continue;
		if (left == right)
			cout << "YES" << endl;
		else
			cout << "NO" << endl;
	}
}

개선된 방법

right 와 left를 따로 두지 말고 stack이라는 한 변수로 더 효율적인 방법이 있음을 알게되습니다.

 

1. string으로 각 철자에 접근해 '('를 찾으면 stack++ ')'를 찾으면 stack--
2. 중간에 stack이 음수가 된다면 for문을 빠져나옴
3. stack이 0이라면 YES 출력 아니라면 NO출력
#include <iostream> // cin, cout, getline
#include <string> // string
using namespace std;

int main()
{
	int t;
	cin >> t;
	cin.ignore();

	string buffer;
	int size = 0;
	while (t--) {
		getline(cin, buffer);
		size = buffer.size();
		int stack = 0;
		for (int i = 0; i < size && stack >= 0; i++) {
			if (buffer[i] == '(') {
				stack++;
			}
			else {
				stack--;
			}
		}
		if (stack)
			cout << "NO" << endl;
		else
			cout << "YES" << endl;
	}
}

위 코드는 백준 C++ 기준 가장 빠른 답안인 tg314님의 코드를 참고했습니다.