๊ด€๋ฆฌ ๋ฉ”๋‰ด

be_better

[์ž๋ฃŒ๊ตฌ์กฐ] ํ (Queue) ๋ณธ๋ฌธ

์ž๋ฃŒ๊ตฌ์กฐ

[์ž๋ฃŒ๊ตฌ์กฐ] ํ (Queue)

NiceTry 2023. 8. 10. 15:43

๋ชฉ์ฐจ

    ๐Ÿ“š ํ (Queue)

    ํ(Queue)๋Š” ํ•œ์ชฝ ๋์—์„œ๋Š” ์‚ฝ์ž… ์—ฐ์‚ฐ๋งŒ ์ด๋ค„์ง€๊ณ , ๋‹ค๋ฅธ ์ชฝ ๋์—์„œ๋Š” ์‚ญ์ œ ์—ฐ์‚ฐ๋งŒ ์ด๋ค„์ง€๋Š” ์„ ํ˜• ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค.

    • First In First Out; FIFO ๋จผ์ € ๋“ค์–ด์˜จ ๋ฐ์ดํ„ฐ๊ฐ€ ๋จผ์ € ๋‚˜๊ฐ€๋Š” ๊ตฌ์กฐ

    Enqueue, Dequeue

    • Enqueue๋Š” ๋ฐ์ดํ„ฐ ์‚ฝ์ž… : Rear์—์„œ ๋ฐœ์ƒ
    • Dequeue๋Š” ๋ฐ์ดํ„ฐ ์‚ญ์ œ : Front์—์„œ ๋ฐœ์ƒ

     

    Front, Rear

    • Front๋Š” ์‚ญ์ œ ์—ฐ์‚ฐ์ด ์ด๋ค„์ง€๋Š” index
    • Rear์€ ์‚ฝ์ž… ์—ฐ์‚ฐ์ด ์ด๋ค„์ง€๋Š” index

    ํฌ๊ธฐ๊ฐ€ ์ •ํ•ด์ง„ ์›ํ˜• ํ ๊ตฌํ˜„์— Front, Rear์„ ๊ฐฑ์‹ ํ•ด์ฃผ๋ฉด ์‰ฝ๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.


    ๐Ÿฆ‹ ํ์˜ ์‚ฌ์šฉ์‚ฌ๋ก€

    • ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰(BFS, Breadth-First Search) ๊ตฌํ˜„
    • ์บ์‹œ(Cache) ๊ตฌํ˜„
    • ํ”„๋ฆฐํ„ฐ์˜ ์ถœ๋ ฅ ์ฒ˜๋ฆฌ
    • ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ
    • ์ฝœ์„ผํ„ฐ ๊ณ ๊ฐ ๋Œ€๊ธฐ์‹œ๊ฐ„

    โœ๐Ÿป ํ ADT (์ถ”์ƒ ๋ฐ์ดํ„ฐ ํƒ€์ž…)

    create() ํ ์ƒ์„ฑ
    enQueue(data) Rear์— ๋ฐ์ดํ„ฐ ์‚ฝ์ž… 
    deQueue() Front์—์„œ ๋ฐ์ดํ„ฐ ์‚ญ์ œํ•˜๋ฉด์„œ ๊ฐ’ return
    peek() ํ์—์„œ ๋ฐ์ดํ„ฐ ์‚ญ์ œํ•˜์ง€ ์•Š๊ณ  Front ๊ฐ’ return
    contains(data) ํ์— data๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธ true, false
    isEmpty() ํ๊ฐ€ ๋น„์–ด์žˆ๋Š”์ง€ ํ™•์ธ (front == rear)
    isFull() ํ๊ฐ€ ๊ฐ€๋“ ์ฐจ์žˆ๋Š”์ง€ ํ™•์ธ (front == (rear + 1))
    size() ํ์˜ ํฌ๊ธฐ ๋ฐ˜ํ™˜ int return
    clear() ํ์˜ ๋ฐ์ดํ„ฐ ์ดˆ๊ธฐํ™”
    print() ํ์˜ ๋ฐ์ดํ„ฐ ์ถœ๋ ฅ

    โš™๏ธ ํ ๊ธฐ๋Šฅ & ๋™์ž‘์›๋ฆฌ

    ์ƒ์„ฑ

    1. front, rear ๋ณ€์ˆ˜ ์„ ์–ธ
    2. ํ์˜ ํฌ๊ธฐ๋Š” ์›ํ•˜๋Š” ํฌ๊ธฐ๋ณด๋‹ค 1๋งŒํผ ๋” ํ• ๋‹น
    3. 2๋ฒˆ๊ณผ ๊ฐ™์ด ํ•˜๋Š” ์ด์œ ๋Š” ์ดˆ๊ธฐ front, rear์„ ๊ฐ™์€ ์œ„์น˜์— ์žก์•„์ฃผ๊ธฐ ์œ„ํ•จ

    // ์Šˆ๋„ ์ฝ”๋“œ
    
    T[] Queue; // Queue Array ์ƒ์„ฑ
    int front = 0;
    int rear = 0; // ์ดˆ๊ธฐ front, rear๋Š” ๊ฐ™๊ฒŒ ์„ค์ •
    
    public void createQueue(int size) {
    	T[] Queue = new T[size + 1]; // size + 1์„ ํ•œ ํ›„์— ๋ฐฐ์—ด ์ƒ์„ฑ
    }

     

    ์‚ฝ์ž…

    1. ํ๊ฐ€ ๊ฐ€๋“ ์ฐจ์žˆ๋Š”์ง€ ํ™•์ธ isFull() -> front์™€ rear์ด ๊ฐ™์€ ๊ฐ’์ธ์ง€ ํ™•์ธ
    2. ๊ฐ€๋“ ์ฐจ์žˆ๋‹ค๋ฉด isFull() true ๋ฐ˜ํ™˜ ํ›„ ์ข…๋ฃŒ
    3. ๊ฐ€๋“ ์ฐจ์žˆ์ง€ ์•Š๋‹ค๋ฉด rear์„ ํ•˜๋‚˜ ์ฆ๊ฐ€
    4. rear์— ๋ฐ์ดํ„ฐ ์‚ฝ์ž…(enQueue)
    // ์Šˆ๋„ ์ฝ”๋“œ
    
    public void enQueue(T item) {
    	if (isFull()) {
        	return error;
        }
        
        rear = (rear + 1) % Queue.length;
        /*
         * rear + 1 ์„ ํ–ˆ์„ ๋•Œ ์ฒ˜์Œ ์ •ํ•ด์ค€ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋ฅผ ๋„˜์„ ์ˆ˜๋„ ์žˆ๋‹ค.
         * ๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋‚˜๊ธฐ ๋•Œ๋ฌธ์— front != rear ์ด ์•„๋‹ˆ๋ผ๋ฉด
         * % Queue.length๋ฅผ ํ•ด์„œ ๋‹ค์‹œ 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.
         */
        Queue[rear] = item;
    }

     

    ์‚ญ์ œ

    1. ํ๊ฐ€ ๋น„์–ด์žˆ๋Š”์ง€ ํ™•์ธ isEmpty()
    2. ๋น„์–ด์žˆ๋‹ค๋ฉด isEmpty() true ๋ฐ˜ํ™˜ ํ›„ ์ข…๋ฃŒ
    3. ๋น„์–ด์žˆ์ง€ ์•Š๋‹ค๋ฉด front ํ•˜๋‚˜ ์ฆ๊ฐ€
    4. ์ฆ๊ฐ€ํ•œ front์˜ ๋ฐ์ดํ„ฐ ๋ฐ˜ํ™˜ (deQueue)
    // ์Šˆ๋„ ์ฝ”๋“œ
    
    public T deQueue() {
    	if (isEmpty()) {
        	return error;
        }
        
        front = (front + 1) % Queue.length;
        /*
         * enQueue์˜ rear๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ %์—ฐ์‚ฐ์œผ๋กœ ์ˆœํ™˜ ํ ๊ด€๋ฆฌ
         */
         return Queue[front];
    }

     

    ๐Ÿค” ์ฝ”๋“œ์— ๋Œ€ํ•œ ์˜๋ฌธ

    ๋ฐ˜ํ™˜ํ•˜๋ ค๋Š” ๊ฐ’์„ ๋‹ค๋ฅธ ๋ณ€์ˆ˜์— ๋ฏธ๋ฆฌ ์ €์žฅํ•ด๋†“๊ณ  ๊ทธ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ๊ฐ€?

    ์ฒ˜์Œ ํ๋ฅผ ๋งŒ๋“ค ๋•Œ front, rear์—๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์žˆ์ง€ ์•Š๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ๊ฐ’์ด ํ•˜๋‚˜๋ผ๋„ ๋“ค์–ด์™”์„ ๋•Œ rear์„ ์ฆ๊ฐ€์‹œ์ผฐ๋‹ค.

    ์ดˆ๊ธฐ front์—๋Š” ์•„๋ฌด๊ฐ’๋„ ๋“ค์–ด ์žˆ์ง€ ์•Š์œผ๋‹ˆ deQueueํ•˜๋ ค๋Š” ๊ฐ’์€ ํ˜„์žฌ front์œ„์น˜๊ฐ€ ์•„๋‹ˆ๋ผ ๊ทธ ๋‹ค์Œ ์œ„์น˜์˜ ๊ฐ’์ด๋‹ค.

     

    ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— front + 1 ์œ„์น˜์— ์žˆ๋Š” ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ.

     

    ๋‹ค์Œ deQueue ๋™์ž‘์„ ํ•˜๊ฒŒ๋˜๋ฉด ๋˜๋‹ค์‹œ front + 1์„ ํ• ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ˜„์žฌ front์˜ ๊ฐ’์„ ๋”ฐ๋กœ ์ง€์›Œ์ค„ ํ•„์š”๋Š” ์—†๋‹ค.


    โฑ๏ธ ํ์˜ ์‹œ๊ฐ„๋ณต์žก๋„

    • ์‚ฝ์ž…(Insertion) O(1)
    • ์‚ญ์ œ(Deletion) O(1)
    • ๊ฒ€์ƒ‰(Search) O(n)

    ์‚ฝ์ž…(Enqueue)์€ Front์—์„œ ์ด๋ค„์ง€๊ณ  ์‚ญ์ œ(Dequeue)๋Š” Rear์—์„œ ์ด๋ค„์ง€๊ธฐ ๋•Œ๋ฌธ์— ํ•œ๋ฒˆ์”ฉ๋งŒ ์ˆ˜ํ–‰ํ•˜๋ฉด ๋œ๋‹ค. O(1)

    ๊ฒ€์ƒ‰์€ ์›ํ•˜๋Š” ๊ฐ’์„ ์ฐพ์„ ๋•Œ ๊นŒ์ง€ ๊ณ„์† ์ˆ˜ํ–‰ํ•ด์•ผ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ตœ๋Œ€ O(n)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ–๋Š”๋‹ค.