프로그래밍 공부/코딩테스트 준비

#5 코테준비 - 덱(Deque)

데브준우 2022. 9. 23. 12:02

덱(Deque)

- 양쪽끝에서 삽입/삭제가 가능한 자료구조

- 큐,스택,덱을 합쳐서 Restricted Structure라고 부름.

- Deque / Double Ended Queue라는 뜻을 가지고 있다.

 

- 원소의 추가/제거 O(1)

- 제일 앞/뒤의 원소 확인이 O(1)

 


C++ STL - Deque

 

Deque의 문서를 보면 앞쪽에 원소를 추가/제거 할 수 있다는 것만 빼면 Vector와 상당히 유사한것을 알 수 있다.

자료구조의 Deque은 앞/뒤가 아니면 확인이 불가능하지만 STL의 Deque는 인덱스로도 접근이 가능하다.

 

C++ stl vector vs deque 를 검색하면 많은 글들이 나오니 차이점들은 나중에 파보기로 하고,

코테에서 Vector와 deque중에 어떤걸 쓸지 판단하는 기준은 '앞/뒤 전부 추가/제거가 필요할 때' Deque를 쓰면 된다고 한다.

stl의 Vector는 배열처럼 연속한 메모리 공간을 가지지만, deque는 연속된 메모리 공간을 가지지 않는다.

 

연속한 메모리 공간을 가지면 삽입/삭제할때 그만큼의 연속된 공간을 찾아서 할당해야 하기때문에 이점도 생각할 부분이다.


문제 풀어보기 - 10866번: 덱 (acmicpc.net)

 

10866번: 덱

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지

www.acmicpc.net

 

 

이것도 스택/큐의 문제와 똑같이 명령어대로 실행시키면 되는 문제다.

stl의 deque를 사용했다.

 

#include<iostream>
#include<string>
#include<deque>
using namespace std;

int main(void) {

	ios::sync_with_stdio(0);
	cin.tie(0);


	deque<int> myDeque;

	int n = 0;

	cin >> n;

	while (n--)
	{
		string s;
		cin >> s;

		if (s == "push_front")
		{
			int temp = 0;
			cin >> temp;
			myDeque.push_front(temp);
		}
		else if (s == "push_back")
		{
			int temp = 0;
			cin >> temp;
			myDeque.push_back(temp);
		}
		else if (s == "pop_front")
		{
			if (myDeque.empty()) cout << -1 << '\n';
			else
			{
				cout << myDeque.front() << '\n';
				myDeque.pop_front();
			}
		}
		else if (s == "pop_back")
		{
			if (myDeque.empty()) cout << -1 << '\n';
			else
			{
				cout << myDeque.back() << '\n';
				myDeque.pop_back();
			}
		}
		else if (s == "size")
		{
			cout << myDeque.size() << '\n';
		}
		else if (s == "empty")
		{
			if (myDeque.empty()) cout << 1 << '\n';
			else cout << 0 << '\n';
		}
		else if (s == "front")
		{
			if (myDeque.empty()) cout << -1 << '\n';
			else cout << myDeque.front() << '\n';
		}
		else
		{
			if (myDeque.empty()) cout << -1 << '\n';
			else cout << myDeque.back() << '\n';
		}
	}

	return 0;

}