#문제

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

 

10866번: 덱

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

www.acmicpc.net

 

#작성 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#include <iostream>
using namespace std;
 
typedef class dequeue{
    private:
    const int f=0;        // 데이터 들어있는 제일 앞 위치 가리킴 
    int b =0;        // 데이터가 들어있는 제일 뒤 다음자리 가리킴 
    int data[10000];
    public:
    void push_front(int x){
        if( b==0 ){
            data[0= x;
            b = 1;
        }
        else{
            // 한칸씩 데이터 밀고 
            for(int i=b; i>f; i--){
                data[i] = data[i-1];
            }
            data[0= x;
            b++;
        }
    }
    void push_back(int x){
        if( b==0 ){
            data[0= x;
            b=1;
        }
        else{
            data[b] = x;
            b++;
        }
    } 
    void pop_front(){
        if( b==0 ){
            cout<<-1<<'\n';
            return;
        }
        else{
            cout<<data[f]<<'\n';
            for(int i=f; i<b; i++){
                data[i] = data[i+1];
            }
            b--;
        }
    }
    void pop_back(){
        if( b==0 ){
            cout<<-1<<'\n';
        }
        else{
            cout<<data[b-1]<<'\n';
            b--;
        }
    }
    void size(){
        cout<<b<<'\n';
    }
    void empty(){
        if( b==0 ) cout<<"1\n";
        else cout<<"0\n";
    }
    void front(){
        if( b==0 ) cout<<"-1\n";
        else cout<<data[f]<<'\n';
    }
    void back(){
        if( b==0 ) cout<<"-1\n";
        else cout<<data[b-1]<<'\n';
    }
}dequeue;
int main(){
    dequeue dq;
    int n;
    cin>>n;
    for(int i=0; i<n; i++){
        string s;
        cin>>s;
        if( s=="push_front" ){
            int x;
            cin>>x;
            dq.push_front(x);
        }else if( s=="push_back" ){
            int x;
            cin>>x;
            dq.push_back(x);
        }else if( s=="pop_front" ){
            dq.pop_front();
        }else if( s=="pop_back"){
            dq.pop_back();
        }else if( s=="size"){
            dq.size();
        }else if( s=="empty"){
            dq.empty();
        }else if( s=="front"){
            dq.front();
        }else if( s=="back"){
            dq.back();
        }
    }
    return 0;
}
cs

##

AC판정을 받긴 했지만, 데이터를 front에 넣고 뺄때마다 dequeue에 들어있는 data를 인덱스 0에서부터 시작하도록 밀어줬더니 시간이 생각보다 오래 걸렸다.(296ms)

dequeue에 넣을 수 있는 최대 데이터 수를 정해놓고 ex)10,000,000개. front_idx와 back_idx를 사용해서 관리를 하면 front에 push, pop하는 연산 시간을 줄일 수 있겠지!

 

더 정확히 dequeue를 구현하려면 연결리스트를 이용해서,

Node에 int data, Node* next를 저장할 수 있는 Node 구조체를 만들고

Node* front, back으로 관리하면 front에서 push/pop하는 오버헤드가 훨씬 작겠지!

'BOJ' 카테고리의 다른 글

BOJ 2110번 :: 공유기 설치  (0) 2019.12.31
BOJ 2805번 :: 나무 자르기  (0) 2019.12.30
BOJ 1654번 :: 랜선 자르기  (0) 2019.12.28
BOJ 2049번 :: 피보나치 수 3  (0) 2019.12.28
BOJ 10830번 :: 행렬 제곱  (0) 2019.12.27

+ Recent posts