Algorithm

[BOJ] 1021번 : 회전하는 큐

rudgh99_algo 2024. 8. 7. 17:11

1. problem :

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

 

2. solution 1 :

#include <bits/stdc++.h>
using namespace std; 

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

	int ans = 0;
	int N, M;
	cin >> N >> M; 
	deque<int> D; 
	for (int i = 1; i <= N; i++) {
		D.push_back(i);
	}
	while (M--) {
		int count2 = 0, count3 = 0;
		int x; 
		cin >> x; 
		deque<int> dq2(D); 
		deque<int> dq3(D);
		while (true) {
			if (dq2.front() != x) {
				count2++;
				dq2.push_back(dq2.front());
				dq2.pop_front();
			}
			else {
				dq2.pop_front();
				break;
			}
		}
		while (true) {
			if (dq3.back() != x) {
				count3++;
				dq3.push_front(dq3.back());
				dq3.pop_back();
			}
			else {
				count3++;
				dq3.pop_back();
				break;
			}
		}
		if (count2 >= count3) {
			ans += count3;
			D = dq3;
		}
		else {
			ans += count2;
			D = dq2;
		}
	}
	cout << ans << '\n';
	return 0;
}

 

3. solution 2 :

#include <bits/stdc++.h>
using namespace std; 

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

	int ans = 0;
	int N, M;
	cin >> N >> M; 
	deque<int> D; 
	for (int i = 1; i <= N; i++) {
		D.push_back(i);
	}
	while (M--) {
		int x;
		cin >> x;
		int idx = find(D.begin(), D.end(), x) - D.begin();
		while (D.front() != x) {
			if (idx < (int)D.size() - idx) {
				D.push_back(D.front()); 
				D.pop_front();

			}
			else {
				D.push_front(D.back());
				D.pop_back();
			}
			ans++;
		}
		D.pop_front();
	}
	cout << ans << '\n';
	return 0;
	
}

<source code 출처: https://github.com/encrypted-def/basic-algo-lecture/blob/master/0x07/solutions/1021.cpp >