
Codeforces Round #744 (Div. 3)-E1. Permutation Minimization by Deque
falconlee236
·2021. 11. 27. 09:51
문제 설명
크기가
비어있는 deque(double-ended queue)가 있다고 생각해보자. 큐는 원소를 큐의 앞과 큐의 뒤 모두 삽입이 가능한 자료구조이다. 따라서 만약 deque에
순열의 원소는 순서대로
만약 순열
- deque의 끝에 3을 삽입한다.
- deque의 앞에 1을 삽입한다.
- deque의 끝에 2를 삽입한다.
- deque의 끝에 4를 삽입한다.
우리가 구해야할 수열은 주어진 순열의 모든 원소가 deque에 삽입됐을때 만들 수 있는 수열중에서 원래 순열보다 사전순으로 가장 작은 수열을 찾아야한다.
만약
예를 들어 수열
Input
첫번째 줄은 테스트케이스의 수
각 테스트 케이스의 첫번째 줄에는 순열의 크기
두번째 줄에는 순열의 원소를 나타내는 정수
Output
각 테스트 케이스마다 정답을 출력한다.
Example
input
5
4
3 1 2 4
3
3 2 1
3
3 1 2
2
1 2
2
2 1
output
1 3 2 4
1 2 3
1 3 2
1 2
1 2
문제 접근
사용한 알고리즘: 그리디
걸린 시간 : 00:05
이 문제는 백준에서 비슷한 문제를 푼 적이 있어서 쉽게 풀 수 있었다. 어떻게 E번이 C, D보다 쉬운지는 모르겠는데, 이 사실을 조금 시간이 지나서 깨달아서 아쉬웠다. 조금만 빨리 풀었으면 등수가 더 올랐을 것 같다.
결국 deque로 만들 수 있는 사전순으로 가장 작은 수열을 찾는 문제이기 때문에 deque를 이용해야할 것이다.
간단하게 생각하면 deque에 들어가야할 원소가 deque의 맨 앞에 있는 원소보다 작으면 deque의 앞에 삽입해서 더 작게 만들고, 그 원소보다 크면 deque의 뒤에 삽입해서 크게 만드는 것을 막으면 된다. 그리고 deque가 비어있으면 다음에 올 원소를 무조건 앞에 넣으면 예외 처리가 가능하다.
정답 코드
#include <iostream>
#include <algorithm>
#include <deque>
using namespace std;
int main() {
ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int t; cin >> t;
while(t--){
int n; cin >> n;
deque<int> dq;
for(int i = 0; i < n; i++){
int num; cin >> num;
if(dq.empty() || dq.front() > num) dq.push_front(num);
else dq.push_back(num);
}
for(auto x : dq) cout << x << " ";
cout << "\n";
}
return 0;
}
'알고리즘 > codeforces' 카테고리의 다른 글
Codeforces Round #750 (Div. 2)-B. Luntik and Subsequences (0) | 2021.11.28 |
---|---|
Codeforces Round #750 (Div. 2)-A. Luntik and Concerts (0) | 2021.11.28 |
Codeforces Round #744 (Div. 3)-D. Productive Meeting (0) | 2021.11.27 |
Codeforces Round #744 (Div. 3)-C. Ticks (0) | 2021.11.27 |
Codeforces Round #744 (Div. 3)-B. Shifting Sort (0) | 2021.11.27 |