ํฌ์ŠคํŠธ

[ํ] ๋ฑ (Deque - Double Ended Queue) ๊ตฌํ˜„

๐Ÿ” ๋ฑ์ด๋ž€?

Deque1 ๋ฑ์˜ ๊ธฐ๋Šฅ๋“ค

๋ฑ(Deque - Double ended queue)์€ ์ด๋ฆ„์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด, ํ์ด๊ธด ํ์ธ๋ฐ ์–‘์ชฝ์„ ์“ธ ์ˆ˜ ์žˆ๋Š” ํ์ด๋‹ค. ๋’ค์ชฝ์—์„œ ๋„ฃ๊ณ , ์•ž์ชฝ์—์„œ ๋นผ๋Š” ํ์˜ ๊ธฐ๋Šฅ์—๋‹ค๊ฐ€, ์•ž์ชฝ์—์„œ ๋„ฃ๊ณ , ๋’ค์—์„œ ๋นผ๋Š” ์ถ”๊ฐ€์ ์ธ ๊ธฐ๋Šฅ์ด ์กด์žฌํ•œ๋‹ค. ์ž˜ ์ƒ๊ฐํ•ด๋ณด๋ฉด, ์Šคํƒ์˜ ๊ธฐ๋Šฅ๋„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ๋’ค์ชฝ์— ๋„ฃ๊ณ  ๋บด๋Š” ์—ฐ์‚ฐ์€ ์Šคํƒ์˜ push, pop ์—ฐ์‚ฐ๊ณผ ๋˜‘๊ฐ™๋‹ค. ๋”ฐ๋ผ์„œ ๋ฑ ์ž๋ฃŒ๊ตฌ์กฐ๋Š” ํ์— ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ์„ ๋”ํ•œ ์กฐ๊ธˆ ๋” ์œตํ†ต์„ฑ ์žˆ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋ผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๐Ÿงฎ ๋ฑ์˜ ์—ฐ์‚ฐ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
๋ณ€์ˆ˜:
    - ํฌ๊ธฐ๊ฐ€ ๊ณ ์ •๋œ ๋ฐฐ์—ด
    - ํ์˜ ๋งจ ์•ž์„ ๊ฐ€๋ฅดํ‚ค๋Š” ๋ณ€์ˆ˜
    - ํ์˜ ๋งจ ๋’ค๋ฅผ ๊ฐ€๋ฅดํ‚ค๋Š” ๋ณ€์ˆ˜

์—ฐ์‚ฐ:
    - ๋’ค์— ์‚ฝ์ž… (Enqueue์™€ ๋™์ผ)
    - ์•ž์— ์ œ๊ฑฐ (Dequeue์™€ ๋™์ผ)
    - ๋’ค์— ์ œ๊ฑฐ
        - rear์ž๋ฆฌ์— ์žˆ๋Š” ๊ฐ’์„ ๋ฆฌํ„ด;
        - rear๋ฅผ ์•ž์œผ๋กœ ํ•œ์นธ ๋•ก๊ธด๋‹ค.
        - rear = (rear - 1 + ๋ฐฐ์—ด ํฌ๊ธฐ) % ๋ฐฐ์—ด ํฌ๊ธฐ;
    - ์•ž์— ์‚ฝ์ž…
        - front์ž๋ฆฌ์— ๊ฐ’์„ ์‚ฝ์ž…;
        - front๋ฅผ ์•ž์œผ๋กœ ํ•œ์นธ ๋•ก๊ธด๋‹ค.
        - front = (front - 1 + ๋ฐฐ์—ด ํฌ๊ธฐ) % ๋ฐฐ์—ด ํฌ๊ธฐ;

๊ธฐํƒ€์—ฐ์‚ฐ:
    - ์ถœ๋ ฅ
    - rear ์—ฟ๋ณด๊ธฐ (peek ์—ฐ์‚ฐ)
    - front ์—ฟ๋ณด๊ธฐ (peek ์—ฐ์‚ฐ)

๋’ค์— ์‚ฝ์ž…ํ•˜๋Š” insert_rear()์—ฐ์‚ฐ์€ ์‚ฝ์ž…ํ•˜๊ณ  rear๋ฅผ ํ•˜๋‚˜ ๋’ค๋กœ ๋•ก๊ฒจ์•ผํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๊ณต์‹์€ rear = (rear + 1) % MAX_QUEUE_SIZE์ด๋‹ค. (MAX_QUEUE_SIZE๋Š” ๋ฐฐ์—ด์˜ ํฌ๊ธฐ)

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์•ž์„ ์ œ๊ฑฐํ•˜๋Š” remove_front() ์—ฐ์‚ฐ์€ ํ•˜๋‚˜ ์ œ๊ฑฐํ•˜๊ณ  front๋ฅผ ๋’ค๋กœ ๋•ก๊ฒจ์•ผํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๊ณต์‹์€ front = (front + 1) % MAX_QUEUE_SIZE์ด๋‹ค.

๋’ค๋ฅผ ์ œ๊ฑฐํ•˜๋Š” remove_rear()๋ฅผ ์ƒ๊ฐํ•ด๋ณด์ž. rear์ž๋ฆฌ์— ์žˆ๋Š” ๊ฐ’์„ ๋ฆฌํ„ดํ•ด์ฃผ๊ณ , rear๋ฅผ ์•ž์œผ๋กœ ํ•œ์นธ ๋•ก๊ฒจ์•ผํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๊ณต์‹์€ rear = (rear - 1) % MAX_QUEUE_SIZE๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ํ˜„์žฌ ์›ํ˜•ํ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— rear์€ 0์ด ๋  ์ˆ˜๋„ ์žˆ๋‹ค. ์ด๋Ÿฌ๋ฉด rear = -1 % MAX_QUEUE_SIZE๊ฐ€ ๋˜๋ฒ„๋ฆฐ๋‹ค. ๋‚˜๋จธ์ง€์—ฐ์‚ฐ %์€ ๋‚˜๋ˆ„๋Š” ์ˆ˜๋ฅผ ๋”ํ•˜๊ณ  ๋‚˜๋จธ์ง€๋ฅผ ์ทจํ•ด๋„ ๊ทธ ๊ฐ’์€ ๋˜‘๊ฐ™๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด 3 % 8 = 11 % 8 = 3์ด๋‹ค. ๋”ฐ๋ผ์„œ ์Œ์ˆ˜๋ฅผ ์–‘์ˆ˜๋กœ ๋ฐ”๊พธ๊ธฐ์œ„ํ•ด ๊ณต์‹์„ ์‚ด์ง ๋ณ€ํ˜•ํ•ด์„œ ์“ฐ๋ฉด ๋œ๋‹ค. rear = (rear - 1 + MAX_QUEUE_SIZE) % MAX_QUEUE_SIZE์ด๋‹ค.

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์•ž์— ์‚ฝ์ž…ํ•˜๋Š” insert_front()์—ฐ์‚ฐ์„ ์ƒ๊ฐํ•ด๋ณด์ž. front์ž๋ฆฌ์— ์ƒˆ ์š”์†Œ๋ฅผ ์ €์žฅํ•˜๊ณ , front๋ฅผ ์•ž์œผ๋กœ ํ•œ์นธ ๋•ก๊ฒจ์•ผํ•œ๋‹ค. ์œ„์— ์„ค๋ช…ํ•œ remove_rear()์˜ ๊ฒฝ์šฐ์™€ ๋˜‘๊ฐ™์ด, front = (front - 1 + MAX_QUEUE_SIZE) % MAX_QUEUE_SIZE๋ฅผ ํ•ด์„œ ๋•ก๊ฒจ์ฃผ๋ฉด ๋œ๋‹ค.

๐Ÿ’ก ๋ฑ์˜ ๊ตฌํ˜„

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
void Deque_InsertFront(Deque* dq, element e)
{
    if (Deque_IsFull(dq))
    {
        fprintf(stderr, "Cannot insert rear : Deque is full!\n");
        exit(1);
    }
    // ํ˜„์žฌ front์ž๋ฆฌ์— ์ƒˆ ์š”์†Œ ์ €์žฅ
    dq->arr[dq->front] = e;

    // front๋ฅผ ์•ž์œผ๋กœ ํ•œ์นธ ๋•ก๊ธฐ๊ธฐ
    dq->front = (dq->front - 1 + MAX_QUEUE_SIZE) % MAX_QUEUE_SIZE;
}

element Deque_RemoveRear(Deque* dq)
{
    if (Deque_IsEmpty(dq))
    {
        fprintf(stderr, "Cannot remove front : Deque is empty!\n");
        exit(1);
    }
    // ํ˜„์žฌ rear ์ž๋ฆฌ์— ์žˆ๋Š” ์š”์†Œ๋ฅผ ์ž„์‹œ ์ €์žฅ
    element temp = dq->arr[dq->rear];

    // rear๋ฅผ ์•ž์œผ๋กœ ํ•œ์นธ ๋•ก๊ธฐ๊ธฐ
    dq->rear = (dq->rear - 1 + MAX_QUEUE_SIZE) % MAX_QUEUE_SIZE;

    // ์ž„์‹œ ์ €์žฅํ•œ rear๊ฐ’ ๋ฆฌํ„ด
    return temp;
}

๋ฑ์˜ ๊ตฌํ˜„์€ ์ง€๋‚œ์‹œ๊ฐ„์— ๋ฐฐ์šด ์›ํ˜•ํ๋ฅผ ์‘์šฉํ•˜๋ฉด ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์‚ฌ์‹ค์€ ์ฝ”๋“œ๋ฅผ ๊ทธ๋Œ€๋กœ ์“ฐ๋ฉด ๋œ๋‹ค. ๊ฑฐ๊ธฐ์— insert_front(), remove_rear() ์—ฐ์‚ฐ๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด ๋œ๋‹ค.

๐Ÿ’ป ์ฝ”๋“œ ์ „์ฒด

pastebin ๋ณด๋Ÿฌ๊ฐ€๊ธฐ

output ์‹คํ–‰๊ฒฐ๊ณผ

explanation ์ˆซ์ž๋Š” ์‹คํ–‰ ์ˆœ์„œ๋ฅผ ๋งํ•œ๋‹ค.

โญ์ •๋ฆฌ

  • ํ๋ฅผ ๊ฐœ์„ ํ•œ ๋ฑ ์ž๋ฃŒ๊ตฌ์กฐ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•˜๋‹ค.

์ฐธ๊ณ ์„œ์  : C์–ธ์–ด๋กœ ์‰ฝ๊ฒŒ ํ’€์–ด์“ด ์ž๋ฃŒ๊ตฌ์กฐ (๊ฐœ์ • 3ํŒ), ์ฒœ์ธ๊ตญยท๊ณต์šฉํ•ดยทํ•˜์ƒํ˜ธ, ์ƒ๋Šฅ์ถœํŒ - Yes24๋ฐ”๋กœ๊ฐ€๊ธฐ

์ด ๊ธฐ์‚ฌ๋Š” ์ €์ž‘๊ถŒ์ž์˜ CC BY 4.0 ๋ผ์ด์„ผ์Šค๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.