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

 

이번에 볼 문제는 백준 1835번 문제인 카드이다.

문제는 아래 링크를 확인하자.

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

 

1835번: 카드

첫 번째 줄에 카드의 개수 N(1 ≤ N ≤ 1,000)이 주어진다.

www.acmicpc.net

문제에서 주어지는 원래의 마술 과정을 거꾸로 시뮬레이션하자.

 

즉, N 한장만이 들어있는 카드더미에서, N-1부터 1까지의 각 카드 i를 먼저 앞쪽에 올려놓고, 뒤쪽에서부터 i장의 카드를 순서대로 앞쪽으로 올려놓는 시뮬레이션을 진행하자.

 

위 시뮬레이션으로 얻은 카드를 앞쪽에서부터 출력하는 것으로 문제를 해결할 수 있다.

 

카드를 이동하는 횟수는 O(N^2)로, 이는 문제를 해결하기에 충분한 시간복잡도이다.

 

이러한 시뮬레이션을 하기에 적합한 자료구조로는 deque 등이 있다.

 

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

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

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

	deque<int> dq;
	int N; cin >> N;
	dq.push_back(N);
	for (int i = N - 1; i > 0; i--) {
		dq.push_front(i);
		for (int j = 0; j < i; j++) {
			dq.push_front(dq.back());
			dq.pop_back();
		}
	}

	while (!dq.empty()) {
		cout << dq.front() << ' ';
		dq.pop_front();
	}
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 7573 // C++] 고기잡이  (0) 2022.05.28
[BOJ 2078 // C++] 무한이진트리  (0) 2022.05.27
[BOJ 1623 // C++] 신년 파티  (0) 2022.05.25
[BOJ 21219 // C++] Restaurants  (0) 2022.05.24
[BOJ 3761 // C++] The Stable Marriage Problem  (0) 2022.05.23

+ Recent posts