Study/Algorithm

BOJ (C/C++) 1021번: 회전하는 큐

hwooo 2022. 10. 29. 01:12

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

 

1021번: 회전하는 큐

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

www.acmicpc.net

 


풀이

이 문제의 큐에서는 pop_front()만 수행 가능함.뽑으려는 원소의 위치를 파악한 후, 해당 원소가 앞부분과 뒷부분 중 어디와 더 가까운 지 확인하여 2 or 3번 연산을 수행함.

코드

#include <stdio.h>
#include <deque>
#include <vector>
using namespace std;

vector <int> V;
deque <int> D;

int Get_cnt(int n, int size) {
	int pop, tmp, loc;
	int cnt = 0;

	for (int i = 0; i < size; i++) {
		pop = V[i];

		loc = 0;
		while (D[loc] != pop) loc++; // 뽑으려는 원소의 위치 파악

		// 원소가 뒷부분에 위치 -> 연산3 (오른쪽 이동)
		if (D.size() - loc < loc) {
			for (int j = 0; j < D.size() - loc; j++) {
				tmp = D.back();
				D.pop_back();
				D.push_front(tmp);
				cnt++;
			}
		}

		// 원소가 앞부분에 위치 -> 연산2 (왼쪽 이동)
		else {
			for (int j = 0; j < loc; j++) {
				tmp = D.front();
				D.pop_front();
				D.push_back(tmp);
				cnt++;
			}		
		}
		// 연산 1
		D.pop_front();
	}
	return cnt;
}
int main() {
	int N, M, n;
	scanf("%d %d", &N, &M);
	for (int i = 0; i < N; i++) D.push_back(i + 1);
	for (int i = 0; i < M; i++) {
		scanf("%d", &n);
		V.push_back(n);
	}
	printf("%d", Get_cnt(N, M));

	return 0;
}