BAEKJOON/data structures

[baekJoon1021] 회전하는 큐(STL/deque정리)

ferozsun 2020. 8. 7. 13:02

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

 

1021번: 회전하는 큐

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

www.acmicpc.net


[STL] deque container 정리

▷ 헤더파일: <deque>

▷ 생성자

deque dq;

빈 컨테이너 dq 생성

deque dq(n);

기본값으로 초기화된 n개의 원소 갖는 dq 생성

deque dq(n, x);

x의 값으로 초기화된 n개의 원소 갖는 dq 생성

deque dq(dq2);

dq2를 복사한 dq 생성

▷ 멤버 함수

dq.assign(2, 5);

값을 2로 갖는 원소 5개 할당

dq.front();

첫 번째 원소 참조

dq.back();

마지막 원소 참조

dq.clear();

모든 원소 제거

dq.push_front(8);

첫 번째 원소 앞에 원소 8을 삽입

dq.pop_front();

첫 번째 원소 제거

dq.push_back(5);

마지막 원소 뒤에 원소 5를 삽입

dq.pop_back();

마지막 원소 제거

dq.begin(); / dq.end();

iterator와 사용

dq.rbegin(); / dq.rend();

(역) iterator와 사용

dq.resize(n);

크기를 n으로 변경 (비어있는 원소는 0으로 초기화)

dq.resize(n,3);

크기를 n으로 변경 (비어있는 원소는 3으로 초기화)

dq.size();

원소의 개수를 반환

dq2.swap(dq1);

dq1과 dq2를 바꿈

dq.insert(1, 2, 3);

1번째 위치에 2개의 3을 삽입

dq.insert(3, 4);

3번째 위치에 원소 4 삽입, 삽입한 곳의 iterator를 반환

dq.erase(iter);

iterator가 가리키는 원소 제거, 더 적은 쪽 원소 당겨 채움

dq.empty();

dq가 비었다면 true를 반환

▷ 특징: 메모리 재할당 후 원소를 복사하는 방식으로 성능 저하가 되었던 vector의 단점을 보완


/*
날짜: 2020.08.07
번호: 1021
문제: 2번, 3번 연산의 최솟값을 출력하는 프로그램을 작성하시오.
*/
#include <iostream>
#include <deque>
using namespace std;
int main() {
	int N;	cin >> N; // 크기
	int M; cin >> M; // 뽑아낼 원소 개수
	
	deque<int> dq;
	for (int i = 1; i <= N; ++i) {
		dq.push_back(i);
	}

	int idx = 0;
	int cnt = 0; // 이동 횟수

	while (M--) {
		int get;	cin >> get; // 뽑아낼 원소
		int size = dq.size();

		/* 원소 위치 파악 */
		for (int i = 0; i < size; ++i) {
			if (dq[i] == get) {
				idx = i;	break;
			}
		}

		// 2번 연산 시 idx번 수행
		// 3번 연산 시 dq.size()-idx번 수행
		
		/* 2번 연산을 택하는게 최소인 경우 */
		if (idx < (size - idx)) {
			while (1) {
				if (dq.front() == get) {
					dq.pop_front();	break;
				}
				else {
					cnt++;
					dq.push_back(dq.front());
					dq.pop_front();
				}
			}			
		}

		/* 3번 연산을 택하는게 최소인 경우 */
		else {
			while (1) {
				if (dq.front() == get) {
					dq.pop_front();	break;
				}
				else {
					cnt++;
					dq.push_front(dq.back());
					dq.pop_back();
				}
			}
		}
	}
	
	cout << cnt << "\n";
}