※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 3340번 문제인 Multi-key Sorting이다.
문제는 아래 링크를 확인하자.

https://www.acmicpc.net/problem/3340 

 

3340번: Multi-key Sorting

The first line of output contains one integer, M, the length of the shortest sequence of sort operations equivalent to the input sequence. The second line contains exactly M integers, representing a shortest sequence.

www.acmicpc.net

먼저 임의의 stable sort A와 B에 대하여 배열을 A B A 순으로 정렬하는 것과 B A 순으로 정렬하는 것이 동일함을 관찰하자.

 

다음은 위 관찰에 대한 정당성을 간단히 서술한 것이다: 같은 원소들로 이루어진 두 배열에 "B A"라는 순서의 정렬을 적용한 결과물이라는 관점으로 볼 때 각 정렬으로 얻는 배열 위에서 정렬기준값이 다른 두 원소는 서로 같은 상대적 위치에 있음을 알 수 있다. 또한 정렬기준값이 같은 두 원소는 처음에 A를 적용하나 안하나 상대적 위치가 변하지 않으므로(stable sort) 이 경우에도 각 정렬을으로 얻는 배열 위에서 서로 같은 상대적 위치에 있음을 알 수 있다.

 

따라서 주어지는 정렬의 수열에서 같은 정렬은 마지막에 주어진 정렬만 수행해도 된다는 점을 알 수 있다. 또한 모든 등장한 정렬은 적어도 한 번씩은 등장해야 함은 자명하므로, 위와 같은 성질을 갖는 정렬의 수열을 출력해 문제를 해결하자.

 

아래는 제출한 소스코드이다.

#include <iostream>
#include <vector>
using namespace std;

int C, N;
vector<int> vec, ans;
bool visited[1000001];

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	cin >> C >> N;
	while (N--) {
		cin >> vec.emplace_back();
	}
	while (!vec.empty()) {
		if (!visited[vec.back()]) {
			visited[vec.back()] = 1;
			ans.emplace_back(vec.back());
		}
		vec.pop_back();
	}

	cout << ans.size() << '\n';
	while (!ans.empty()) {
		cout << ans.back() << ' ';
		ans.pop_back();
	}
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 3075 // C++] Astromeeting  (1) 2023.12.29
[BOJ 3061 // C++] 사다리  (0) 2023.12.28
[BOJ 2942 // C++] 퍼거슨과 사과  (1) 2023.12.26
[BOJ 2852 // C++] NBA 농구  (0) 2023.12.25
[BOJ 3018 // C++] 캠프파이어  (0) 2023.12.24

+ Recent posts