[C++]백준1021번 회전하는 큐

1 minute read

문제는 다음과 같다.

오늘은 백준1021번 회전하는 큐 문제를 풀어보도록 하자. deque 또는 circular queue를 이용해서 풀 수 있는 문제이다. 나는 deque를 이용해서 풀었다.

erase함수를 이용해서 pop을 구현했고 left, right변수를 이용해서 index를 조절해주었다. 만일 left or right가 deque의 끝에 가있으면 0으로 바꿔주는 작업이 필요하다. 왜냐하면 erase를 하고 index를 참조하면 out of index error를 경험하기 때문이다.

                                     [코드]
#include <iostream>
#include <deque>
using namespace std;

deque<int>dQ;
int N, M, answer = 0;
int pick_num[51];

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

	cin >> N >> M;

	for (int i = 1; i <= N; i++)dQ.push_back(i);
	for (int i = 0; i < M; i++)cin >> pick_num[i];

	//왼쪽 움직임, 오른족 움직임, 뽑을 수 인덱스
	int left = 0, right = 0, num_idx = 0, step=0;

	while (num_idx < M) {
		if (dQ[left] == pick_num[num_idx]){
			if (left == dQ.size() - 1) {
				dQ.erase(dQ.begin()+left);
				left = 0;
			}
			else {
				dQ.erase(dQ.begin() + left);
			}
			answer += step;
			step = 0;
			num_idx++;
			right = left;
			continue;
		}
		else if (dQ[right] == pick_num[num_idx]) {
			if (right == dQ.size() - 1) {
				dQ.erase(dQ.begin() + right);
				right = 0;
			}
			else {
				dQ.erase(dQ.begin() + right);
			}
			answer += step;
			step = 0;
			num_idx++;
			left = right;
			continue;
		}

		else {
			if (right == dQ.size() - 1) {//오른쪽으로 가야되는데 맨 끝임
				right = 0;
			}
			else {
				right++;
			}

			if (left == 0) {//왼쪽으로 가야되는데 첫번째임
				left = dQ.size() - 1;
			}
			else {
				left--;
			}
			step++;
		}
	}
	cout << answer;
}