문제
https://codeforces.com/contest/1469/problem/A
걸린 시간
00 : 51 : 17
풀이
C++
#include <bits/stdc++.h>
#define fastio ios::sync_with_stdio(0), cin.tie(0)
#define all(c) c.begin(), c.end()
#define INF 1e9
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
bool solve(){
string s;
cin >> s;
int n = s.size();
vector<int> stack;
for(int i = 0; i < n; i++){
if(s[i] == '('){
stack.push_back(i);
}
else if(s[i] == ')'){
if(!stack.empty()){
stack.pop_back();
}
else{
bool exist = false;
for(int j = 0; j < i; j++){
if(s[j] == '?'){
exist = true;
s[j] = '(';
break;
}
}
if(!exist) return false;
}
}
}
int front = 0, back = 0;
for(int i = 0; i < stack.front(); i++){
if(s[i] == '?') front++;
}
for(int i = stack.front(); i < n; i++){
if(s[i] == '?') back++;
}
if(!stack.empty()) back -= stack.size();
if(back >= 0 && (back+front)%2 == 0) return true;
else return false;
}
int main(){
fastio;
int tc;
cin >> tc;
while(tc--){
if(solve()) cout << "YES\n";
else cout << "NO\n";
}
return 0;
}
A 번 문제 치고는 솔루션이 빨리 떠오르질 않아서 조금 당황했던 문제다.
내 풀이는 물음표가 없다고 생각하고 스택을 이용한 괄호 검사를 진행하되 만약 닫는 괄호가 나왔을 경우 배열이 비어 있다면 닫는 괄호 앞에 물음표가 있는지 확인해 주었다. 만약 존재하지 않는다면 RBS 가 될 수 없으므로 NO 를 출력하고 존재한다면 여러 물음표 중 하나를 여는 괄호로 바꾸어 주었다. 괄호검사가 끝나면 스택이 비어있는지와, 물음표가 더 남아 있는지를 확인해야한다. 만약 스택이 비어있지 않다면 존재하는 모든 여는 괄호는 뒤에 오는 물음표와 짝을 맺어야 하므로 스택의 맨 아래 여는 괄호 위치로부터 뒤에 물음표가 몇개 있는지를 세고 여는 괄호 개수만큼 존재하는지를 확인한다. 만약 물음표의 개수가 부족하다면 NO 를 그렇지 않으면 남은 모든 물음표의 개수가 홀수개인지 짝수개인지를 센다. 짝수개일 경우에만 서로 짝을 이룰 수 있으므로 YES 를 그렇지 않으면 NO 를 출력한다.
constructive algorithm 문제라서 인지는 모르겠지만 써 놓고 보니 모두 필요한 설명인데도 너무 장황하게 느껴져서 과연 이게 맞을까 하는 의문이 든다. 다행히도 ac 를 받긴 했다.
'Codeforces' 카테고리의 다른 글
Codeforces #1471A Strange Partition (0) | 2021.04.05 |
---|---|
Codeforces Round #712 (Div. 2) B (0) | 2021.04.04 |
Codeforces #1469B Red and Blue (0) | 2021.04.02 |
Codeforces #1497C1 k-LCM (easy version) (0) | 2021.04.01 |
Codeforces #1497B M-arrays (0) | 2021.04.01 |
댓글