baekjoon 1835 카드

윤주원·2025년 5월 14일
0

baekjoon

목록 보기
13/14

문제 링크 : https://www.acmicpc.net/problem/1835

  • 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;
}
profile
안녕하세요

0개의 댓글