알고리즘/덱

백준 1021번

뇌장하드 2021. 11. 5. 00:48

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

 

1021번: 회전하는 큐

첫째 줄에 큐의 크기 N과 뽑아내려고 하는 수의 개수 M이 주어진다. N은 50보다 작거나 같은 자연수이고, M은 N보다 작거나 같은 자연수이다. 둘째 줄에는 지민이가 뽑아내려고 하는 수의 위치가

www.acmicpc.net

#include<bits/stdc++.h>

using namespace std;

int main(void) {
	ios::sync_with_stdio(0);
	cin.tie(0);
	deque<int> dq;
	queue<int>q;
	int n, m;
	int index=0;
	int cnt=0;
	cin >> n >> m;
	for (int i = 0; i < n; i++) {
		dq.push_back(i + 1);
	}
	for (int i = 0; i < m; i++) {
		int t;
		cin >> t;
		q.push(t);
	}

	while (!q.empty()) {

		for (int i = 0; i < dq.size(); i++) { //찾고자 하는 원소가 덱에 어디에 있는지 판별
			if (q.front() == dq[i]) {
				index = i;
				break;
			}
		}

		if (index <= dq.size() / 2) { //앞쪽에 있을떄 2번연산
			while (1) {
				if (q.front() == dq.front()) { //같다면 덱과 큐를 지워준다.
					dq.pop_front();
					q.pop();
					break;
				}
				else { //다르다면 앞에있으니 앞쪽을 뒤로 보낸다.
					dq.emplace_back(dq.front());
					dq.pop_front();
					cnt++;
				}
			}
		}
		else { //뒤쪽에 있을떄  3번연산
			while (1) {
				if (q.front() == dq.back()) { //같다면 덱과 큐를 지워준다.
					dq.pop_back();
					q.pop();
					break;
				}
				else { //다르다면 뒤에있으니 뒤쪽을 앞으로 보낸다.
					dq.emplace_front(dq.back());
					dq.pop_back();
					cnt++;
				}
			}

		}

	}
	cout << cnt;
}