[C++] 백준 9012. 괄호

멋진감자·2024년 12월 6일
1

알고리즘

목록 보기
28/64
post-thumbnail

문제

풀이

맨 처음에는 왼쪽짜리 개수랑 오른쪽짜리 개수가 같으면 되는 거 아녀?
라고 생각했는데
입력 예시 중 ())(() 이걸 보고 아니구나 싶었다.
그러면 계속 도는 수밖에 없구만 하고 써내려간 코드

앞뒷자리가 괄호 짝을 이루면 지우고, 탐색 인덱스를 다시 0으로 보내거나
짝을 이루지 않으면 탐색 인덱스++ 하는 과정을 반복한다.

뭔가 시간 초과날 것 같은 코드였는데 안나드라
다른 멋진 코드들을 찾아보고 공부하면 좋겠지만 배가 많이 부르니 뒤로 미루기

코드

#include <iostream>
#include <string>
#include <vector>
using namespace std;

int t;
string str;
vector<char> v;

void isVPS() {
	int idx = 0;
	while (idx < v.size() - 1 && !v.empty()) {
		if (v[idx] == '(' && v[idx + 1] == ')') {
			v.erase(v.begin() + idx);
			v.erase(v.begin() + idx);
			idx = 0;
		}
		else idx++;
	}

	if (v.empty()) cout << "YES\n";
	else cout << "NO\n";

	return;
}

int main() {
	cin >> t;
	for (int i = 0; i < t; i++) {
		cin >> str;

		if (str[0] == ')') {
			cout << "NO\n";
		}
		else {
			v.clear();
			for (int j = 0; j < str.length(); j++) {
				v.push_back(str[j]);
			}
			isVPS();
		}
	}

	return 0;
}

채점

profile
난멋져

2개의 댓글

comment-user-thumbnail
2024년 12월 7일

이걸 두문제 더 풀고 잤어?
진짜 대단스..

풀이 알고리즘 잘 생각했고 구현도 깔끔하게 됬어.
나중을 위한 코테용 피드백 주면 erase 함수는 최대한 안쓰는게 좋아!
erase가 사용하면 중간 데이터를 지우고 뒤 데이터를 모두 앞으로 땡겨와서 생각보다 시간 복잡도 Log(N)으로 커.

간단하게 풀려면 stack 써도 좋고, 순서대로 확인하면서 '('갯수보다 ')'가 많아지는지 확인해도 편함!

stack 풀이 : https://www.acmicpc.net/source/87247430
단순 +- 풀이 : https://www.acmicpc.net/source/87247695

1개의 답글