πŸ‘Š PS/Algorithm

[Baekjoon] 30805번: 사전 순 μ΅œλŒ€ 곡톡 λΆ€λΆ„ μˆ˜μ—΄

hades1 2024. 9. 9. 21:35

πŸ₯… 문제

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;
}