deque과 queue 두가지로 구현해보겠다.
처음엔 queue 문제라고만 생각해서 너무 어렵게 구현이 된거 같다.
항상 다양한 접근법을 가지고 문제를 풀어야겠다고 생각했다.
queue
#include <iostream>
#include <queue>
using namespace std;
int main() {
int n;
cin >> n;
queue<int> q;
// 역순으로 1까지 처리
for (int i = n; i >= 1; --i) {
// 1) push_front(i) 구현: 큐에 i 추가 후 (L-1)회 회전
q.push(i);
int L = q.size();
for (int k = 0; k < L - 1; ++k) {
q.push(q.front());
q.pop();
}
// 2) 뒤에서 i장 옮기기 구현: 큐를 한꺼번에 i번 오른쪽 회전
L = q.size(); // 현재 큐 길이 (L = n - i + 1)
int r = i % L; // i번 회전의 순환 효과 최적화
if (r != 0) {
int moveFrontCount = L - r; // 왼쪽으로 이동할 횟수 = L - (i mod L)
for (int k = 0; k < moveFrontCount; ++k) {
q.push(q.front());
q.pop();
}
}
// 이제 i 단계 완료, 다음 i-1로 반복
}
// 최종 큐에는 초기 카드 순서가 담겨 있음. 출력하기
while (!q.empty()) {
cout << q.front();
q.pop();
if (!q.empty()) cout << ' ';
}
return 0;
}
}
deque
#include <iostream>
#include <deque>
using namespace std;
int main() {
deque<int> dq;
int n; cin >> n;
for (int i = n; i > 0; i--)
{
dq.push_front(i);
for (int j = 0; j < i; j++)
{
dq.push_front(dq.back());
dq.pop_back();
}
}
for (auto x : dq)
cout << x << " ";
return 0;
}