※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 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();
}
}
'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 |