다 간단함. queue에 관한 문제.
queue는 First In First Out!1021
놀이공원 줄 생각하면 됨. 먼저 선 사람대로 먼저 나감.
들어오는 사람은 앞사람 뒤에 줄 섬.
간단
간단.
find()
알아두기.
int idx = find(dq.begin(), dq.end(), t) - dq.begin();
어우 복잡. 골드인데 생각이 좀 필요하지만 깔끔하게 떨어지는 문제가 아니라 그냥 구현이 복잡;;
#include <bits/stdc++.h>
using namespace std;
deque<int> dq;
bool is_front;
void print() {
cout << '[';
for (int i = 0; i < dq.size(); ++i) {
if (is_front)
cout << dq[i];
else
cout << dq[dq.size() - 1 - i];
if (i == dq.size() - 1) break;
cout << ',';
}
cout << "]\n";
}
void run(string cmd) {
for (auto c : cmd) {
if (c == 'R')
is_front = !is_front;
else {
if (dq.empty()) {
cout << "error\n";
return;
}
if (is_front)
dq.pop_front();
else
dq.pop_back();
}
}
print();
}
void fill_dq(string numbers) {
dq.clear();
is_front = 1;
int x = 0;
for (auto c : numbers) {
if (isdigit(c)) {
x = x * 10 + c - '0';
} else if (c == ',' || c == ']') {
if (x < 1) continue;
dq.push_back(x);
x = 0;
}
}
}
int main(void) {
ios::sync_with_stdio(0);
cin.tie(0);
// 4
int T;
cin >> T;
while (T--) {
// RDD
string cmd;
cin >> cmd;
// 4
int n;
cin >> n;
// [1,2,3,4]
string numbers;
cin >> numbers;
fill_dq(numbers);
run(cmd);
}
}
#include <bits/stdc++.h>
using namespace std;
#define X first
#define Y second
deque<pair<int, int> > dq;
int main(void) {
ios::sync_with_stdio(0);
cin.tie(0);
int N, L;
cin >> N >> L;
for (int i = 0; i < N; ++i) {
int x;
cin >> x;
if (!dq.empty() && dq.front().Y < i - L + 1) dq.pop_front();
while (!dq.empty() && dq.back().X >= x) dq.pop_back();
dq.push_back({x, i});
cout << dq.front().X << ' ';
}
}
헙 많이 발전했다....
이제 스택 큐 관련 문제는 대충 감이 잡힌다
아주 간단
#include <bits/stdc++.h>
using namespace std;
int main(void) {
ios::sync_with_stdio(0);
cin.tie(0);
int n;
cin >> n;
int ans = 0;
while (n--) {
string str;
cin >> str;
stack<char> s;
for (auto c : str) {
if (!s.empty() && s.top() == c)
s.pop();
else
s.push(c);
}
if (s.empty()) ++ans;
}
cout << ans;
}
조금 복잡
#include <bits/stdc++.h>
using namespace std;
int main(void) {
ios::sync_with_stdio(0);
cin.tie(0);
string str;
cin >> str;
stack<char> s;
int ans = 0;
for (int i = 0; i < str.length(); ++i) {
if (str[i] == '(')
s.push(str[i]);
else {
s.pop();
if (i > 0 && str[i - 1] == ')')
++ans;
else
ans += s.size();
}
}
cout << ans;
}
분배법칙!!
ex)
(()[[]])([])
이는 (())
+ ([[]])
+ ([])
와 같음.
더해져야 하는 값들은 맞닿아 있는 쌍의 개수와 같음.
여는 괄호면 stack에 push하고 닫는 괄호면 stack에서 pop해야 하는 기본 원리는 같다.
대신 여기선 여는 괄호를 push할 때 곱해져야 하는 값들을 update 해가고
pop할 때는 곱해졌던 값을 다시 나눠준다
이때 맞닿아 있는 쌍인 경우엔 ans 값에 더해준다
여는 괄호((, [
)를 만나면:
닫는 괄호(), ]
)를 만나면:
#include <bits/stdc++.h>
using namespace std;
bool is_match(char a, char b) {
return (a == '[' && b == ']') || (a == '(' && b == ')');
}
bool is_open(char c) { return c == '[' || c == '('; }
int multi(char c) {
if (c == '[' || c == ']') return 3;
if (c == '(' || c == ')') return 2;
return 0;
}
int main(void) {
ios::sync_with_stdio(0);
cin.tie(0);
string str;
cin >> str;
stack<char> s;
int ans = 0, value = 1;
for (int i = 0; i < str.length(); ++i) {
// open이면 multi 곱하고 stack에 push
if (is_open(str[i])) {
value *= multi(str[i]);
s.push(str[i]);
} else { // 닫기이면
if (s.empty() ||
!is_match(s.top(), str[i])) { // 올바르지 않으면 0 리턴
cout << '0';
return 0;
} else {
if (is_match(str[i - 1], str[i]))
ans += value; // 맞쌍이면 ans 업데이트
value /= multi(str[i]);
s.pop();
}
}
}
if (!s.empty()) // ()( 인 경우를 거르기 위함
cout << '0';
else
cout << ans;
}
꽤 까다롭...