맨 처음에는 왼쪽짜리 개수랑 오른쪽짜리 개수가 같으면 되는 거 아녀?
라고 생각했는데
입력 예시 중 ())(()
이걸 보고 아니구나 싶었다.
그러면 계속 도는 수밖에 없구만 하고 써내려간 코드
앞뒷자리가 괄호 짝을 이루면 지우고, 탐색 인덱스를 다시 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;
}
이걸 두문제 더 풀고 잤어?
진짜 대단스..
풀이 알고리즘 잘 생각했고 구현도 깔끔하게 됬어.
나중을 위한 코테용 피드백 주면 erase 함수는 최대한 안쓰는게 좋아!
erase가 사용하면 중간 데이터를 지우고 뒤 데이터를 모두 앞으로 땡겨와서 생각보다 시간 복잡도 Log(N)으로 커.
간단하게 풀려면 stack 써도 좋고, 순서대로 확인하면서 '('갯수보다 ')'가 많아지는지 확인해도 편함!
stack 풀이 : https://www.acmicpc.net/source/87247430
단순 +- 풀이 : https://www.acmicpc.net/source/87247695