개념

덱은 앞과 뒤 양쪽 끝에서 원소를 삽입·삭제하는 자료구조입니다. 앞쪽 끝을 front, 뒤쪽 끝을 back이라고 합니다.

앞에 원소 추가

앞에서부터 20,30,40,50,6020,30,40,50,60이 들어 있는 덱입니다. front는 2020, back은 6060입니다.

20 30 40 50 60 front back
▲ [그림 1] 덱의 앞쪽 원소 추가 — 연산 전

앞쪽에 1010을 넣으면 2020 앞에 들어가고, 1010이 새로운 front가 됩니다.

10 20 30 40 50 60 front back
▲ [그림 2] 덱의 앞쪽 원소 추가 — 연산 후

뒤에 원소 추가

앞에서부터 10,20,30,40,50,6010,20,30,40,50,60이 들어 있는 덱에 7070을 추가합니다.

10 20 30 40 50 60 front back
▲ [그림 3] 덱의 뒤쪽 원소 추가 — 연산 전

뒤쪽에 7070을 넣으면 6060 뒤에 들어가고, 7070이 새로운 back이 됩니다.

10 20 30 40 50 60 70 front back
▲ [그림 4] 덱의 뒤쪽 원소 추가 — 연산 후

앞에서 원소 삭제

앞에서부터 10,20,30,40,50,60,7010,20,30,40,50,60,70이 들어 있는 덱에서 앞쪽 원소를 꺼냅니다.

10 20 30 40 50 60 70 front back
▲ [그림 5] 덱의 앞쪽 원소 제거 — 연산 전

front에 있던 1010이 제거되고, 2020이 새로운 front가 됩니다.

20 30 40 50 60 70 front back
▲ [그림 6] 덱의 앞쪽 원소 제거 — 연산 후

뒤에서 원소 삭제

앞에서부터 20,30,40,50,60,7020,30,40,50,60,70이 들어 있는 덱에서 뒤쪽 원소를 꺼냅니다.

20 30 40 50 60 70 front back
▲ [그림 7] 덱의 뒤쪽 원소 제거 — 연산 전

back에 있던 7070이 제거되고, 6060이 새로운 back이 됩니다.

20 30 40 50 60 front back
▲ [그림 8] 덱의 뒤쪽 원소 제거 — 연산 후

언어별 사용법

동작C++ dequeJava ArrayDequePython collections.deque
앞에 넣기push_front(x)addFirst(x)appendleft(x)
뒤에 넣기push_back(x)addLast(x)append(x)
앞에서 꺼내기pop_front()removeFirst()popleft()
뒤에서 꺼내기pop_back()removeLast()pop()

양 끝 연산은 O(1)O(1) 또는 분할 상환 O(1)O(1)이며, 공간복잡도는 O(N)O(N)입니다.

예제

문제

처음에 비어 있는 덱에 다음 명령을 순서대로 수행하여라.

명령동작
push_front x맨 앞에 xx를 추가한다.
push_back x맨 뒤에 xx를 추가한다.
front맨 앞 값을 출력한다. 빈 덱이면 EMPTY를 출력한다.
back맨 뒤 값을 출력한다. 빈 덱이면 EMPTY를 출력한다.
pop_front맨 앞 값을 출력하고 제거한다. 빈 덱이면 EMPTY를 출력한다.
pop_back맨 뒤 값을 출력하고 제거한다. 빈 덱이면 EMPTY를 출력한다.
size원소 수를 출력한다.

입력

첫째 줄에 명령 수 QQ가 주어진다. 1≤Q≤10 0001\le Q\le10\,000이다.

다음 QQ개 줄에 위 표의 형식으로 명령이 하나씩 주어진다. 명령과 인자는 공백을 사이에 두고 주어진다. 추가할 값 xx의 범위는 1≤x<10 0001\le x<10\,000이다.

출력

출력이 필요한 명령의 결과를 한 줄에 하나씩 출력한다.

예제 입력

9
push_back 10
push_front 20
front
back
pop_back
size
pop_front
pop_front
size

예제 출력

20
10
10
1
20
EMPTY
0

예제 코드

C++20

#include <iostream>
#include <string>
#include <deque>

using namespace std;

int main() {
    int q, i, x;
    deque<int> dq;
    string op;

    cin >> q;

    for (i = 0; i < q; ++i) {
        cin >> op;

        if (op == "push_front") {
            cin >> x;

            dq.push_front(x);
        }
        else if (op == "push_back") {
            cin >> x;

            dq.push_back(x);
        }
        else if (op == "size") cout << dq.size() << '\n';
        else if (dq.empty()) cout << "EMPTY\n";
        else if (op == "front") cout << dq.front() << '\n';
        else if (op == "back") cout << dq.back() << '\n';
        else if (op == "pop_front") {
            cout << dq.front() << '\n';
            dq.pop_front();
        }
        else {
            cout << dq.back() << '\n';
            dq.pop_back();
        }
    }
}