[Baekjoon] 30805λ²: μ¬μ μ μ΅λ κ³΅ν΅ λΆλΆ μμ΄
π₯ λ¬Έμ
https://www.acmicpc.net/problem/30805
π μ€κ³
μ¬μ μμΌλ‘€ κ°μ₯ λ€μ μλ κ³΅ν΅ λΆλΆ μμ΄μ μ°ΎμΌλ©΄ λλ―λ‘, λ¨Όμ κ° μμ΄μ ν° μκ° μμ μ€λλ‘, μμ ν¬κΈ°κ° κ°λ€λ©΄, μΈλ±μ€κ° μμ κ²μ΄ μμ μ€λλ‘ νκ² νκΈ° μν΄ μ°μ μμ νλ₯Ό μ΄μ©νμλ€.
κ°κ°μ μ°μ μμ νμμ μμ μλ νλλ₯Ό κΊΌλ΄λ©΄μ κ°λ€λ©΄, κ²°κ³Όμ μΆκ°νλ€.
λ€λ₯΄λ€λ©΄, ν° κ²μ΄ μλ μ°μ μμ νμμ νλλ₯Ό μμ€λ€. ν° κ²μ΄ κ³μ λ¨μμλ€λ©΄, κ·Έμ κ°μ κ²μ΄ λ€λ₯Έ μͺ½μ μκΈ° λλ¬Έμ΄λ€.
μ£Όμν΄μΌν κ²μ ν¬κΈ° λΏλ§ μλλΌ κ²°κ³Όμ ν¬ν¨λλ μκ° κ°κ° μμͺ½ μμ΄μμ μ΄λ μΈλ±μ€μ μμΉνλ μ§λ₯Ό κΈ°λ‘νκ³ , κ·Έ μΈλ±μ€λ³΄λ€ μλ€λ©΄ κ²°κ³Όμ μΆκ°λ μ μμΌλ―λ‘ μμ λ κ³Όμ μ΄ ν¬ν¨λμ΄μΌ νλ€.
π νμ΄
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
int n, m, number, limit_a_idx = 0, limit_b_idx = 0;
struct compare {
bool operator()(pair<int, int> a, pair<int, int> b) {
if (a.first == b.first) {
return a.second > b.second;
}
return a.first < b.first;
}
};
priority_queue<pair<int, int>, vector<pair<int, int>>, compare> pq1;
priority_queue<pair<int, int>, vector<pair<int, int>>, compare> pq2;
vector<int> result;
int main(void)
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n;
for (int i = 0; i < n; i++) {
cin >> number;
pq1.push({ number, i });
}
cin >> m;
for (int i = 0; i < m; i++) {
cin >> number;
pq2.push({ number, i });
}
while (!pq1.empty() && !pq2.empty()) {
if (!pq1.empty() && pq1.top().second < limit_a_idx) {
pq1.pop();
continue;
}
if (!pq2.empty() && pq2.top().second < limit_b_idx) {
pq2.pop();
continue;
}
if (pq1.top().first == pq2.top().first) {
result.push_back(pq1.top().first);
limit_a_idx = pq1.top().second;
limit_b_idx = pq2.top().second;
pq1.pop();
pq2.pop();
}
else if (pq1.top().first > pq2.top().first) {
pq1.pop();
}
else if (pq1.top().first < pq2.top().first) {
pq2.pop();
}
}
int size = result.size();
cout << size << "\n";
for (int i = 0; i < size; i++) {
cout << result[i] << " ";
}
return 0;
}