ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Data Structure] ํ (Queue)
    Data Structure 2022. 2. 13. 19:08

    ์•ˆ๋…•ํ•˜์„ธ์š”!

    ์ด๋ฒˆ์—๋Š” Queue์— ๋Œ€ํ•ด์„œ ํฌ์ŠคํŒ…ํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค!

     

     

    1. Queue๋ž€?

    Queue๋Š” ํ•œ์ชฝ ๋์—์„œ๋งŒ ์›์†Œ์˜ ์ถ”๊ฐ€๊ฐ€ ์ด๋ฃจ์–ด์ง€๊ณ , ๋‹ค๋ฅธ ํ•œ์ชฝ ๋์—์„œ๋งŒ ์›์†Œ์˜ ์ œ๊ฑฐ๊ฐ€ ์ด๋ฃจ์–ด์ง€๋Š” ์ˆœ์ฐจํ™”๋œ ๋ฆฌ์ŠคํŠธ์ž…๋‹ˆ๋‹ค.

    ์›์†Œ์˜ ์ถ”๊ฐ€๊ฐ€ ์ด๋ฃจ์–ด์ง€๋Š” ์ชฝ์„ rear, ์›์†Œ์˜ ์ œ๊ฑฐ๊ฐ€ ์ด๋ฃจ์–ด์ง€๋Š” ์ชฝ์„ front๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

    ์ฆ‰, rear๋กœ ์›์†Œ๊ฐ€ ๋“ค์–ด์˜ค๊ณ , front๋กœ ์›์†Œ๊ฐ€ ๋‚˜๊ฐ„๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

     

    Queue๋Š” ๊ฐ€์žฅ ๋จผ์ € ๋“ค์–ด์˜จ ์›์†Œ๊ฐ€ ๊ฐ€์žฅ ๋จผ์ € ๋‚˜์˜ค๊ธฐ ๋•Œ๋ฌธ์— FIFO (First-In-First-Out) ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

     

    Queue ๋˜ํ•œ Stack๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์›์†Œ์˜ ์ถ”๊ฐ€/์ œ๊ฑฐ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(1)์ž…๋‹ˆ๋‹ค.

    ์ œ์ผ ์•ž๊ณผ ๋’ค์— ์žˆ๋Š” ์›์†Œ๋ฅผ ํ™•์ธํ•˜๋Š” ์‹œ๊ฐ„๋ณต์žก๋„ ๋˜ํ•œ O(1)์ž…๋‹ˆ๋‹ค.

    ๊ทธ๋ฆฌ๊ณ  Queue์˜ ์ œ์ผ ์•ž๊ณผ ๋’ค๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ์›์†Œ๋“ค์˜ ํ™•์ธ ๋˜๋Š” ๋ณ€๊ฒฝ์€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

     

     

     

    2. Queue ๊ตฌํ˜„ํ•˜๊ธฐ

     

    Queue๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    struct Queue<T> {
        private var queue: [T] = []
        
        // queue๊ฐ€ ๋น„์–ด์žˆ๋Š”์ง€ ํ™•์ธ
        var isEmpty: Bool {
            return queue.isEmpty
        }
        
        // queue์˜ front (์ œ์ผ ์•ž์˜ ์›์†Œ ํ™•์ธ)
        var front: T? {
            return queue.first
        }
        
        // queue์˜ rear (์ œ์ผ ๋’ค์˜ ์›์†Œ ํ™•์ธ)
        var rear: T? {
            return queue.last
        }
        
        // queue์˜ ์›์†Œ ๊ฐฏ์ˆ˜
        var count: Int {
            return queue.count
        }
        
        // queue์˜ rear์— ์›์†Œ ์ถ”๊ฐ€
        mutating func enqueue(_ element: T) {
            queue.append(element)
        }
        
        // queue์˜ front์—์„œ ์›์†Œ ์ œ๊ฑฐ
        mutating func dequeue() -> T? {
            return isEmpty ? nil : queue.removeFirst()
        }
    }

     

     

    Queue ๋˜ํ•œ ๋‹ค์–‘ํ•œ ์ž๋ฃŒํ˜•์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด Generic์œผ๋กœ ์„ ์–ธํ•˜์˜€๊ณ ,

    queue ๋ผ๋Š” ๋ฐฐ์—ด์— ์›์†Œ๋ฅผ ์ €์žฅํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ต๋‹ˆ๋‹ค!

     

    var myQueue = Queue<Int>()
    
    myQueue.enqueue(0)
    myQueue.enqueue(1)
    myQueue.enqueue(2)
    
    print("front:", myQueue.front!) // 0
    print("rear:", myQueue.rear!) // 2
    print("count:", myQueue.count) // 3
    
    myQueue.dequeue() // front์ธ 0์„ dequeue
    myQueue.dequeue() // front์ธ 1์„ dequeue
    
    print("front:", myQueue.front!) // 2
    print("rear:", myQueue.rear!) // 2
    
    myQueue.dequeue() // front์ธ 2๋ฅผ dequeue
    myQueue.dequeue() // nil
    
    print("count", myQueue.count) // 0

     

    ์œ„ ์ฝ”๋“œ์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.



    ์ถ”๊ฐ€๋กœ,,

    Swift๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ๋ฅผ ํ’€๋‹ค๋ณด๋‹ˆ ์‹œ๊ฐ„์ดˆ๊ณผ๋ฅผ ๊ต‰์žฅํžˆ ๋งŽ์ด ๊ฒช์—ˆ์Šต๋‹ˆ๋‹ค!

    removeFirst()์˜ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ O(n)์ด๊ธฐ ๋•Œ๋ฌธ์—, removeFirst()๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚˜๋Š” ๊ฒƒ ๊ฐ™๋”๋ผ๊ตฌ์š”.

     

    ๊ทธ๋ž˜์„œ removeFirst()๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  Queue๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์ถ”๊ฐ€ํ•˜์˜€์Šต๋‹ˆ๋‹ค!

    struct AnotherQueue<T> {
        private var list1: [T] = [] // enqueue๋ฅผ ์œ„ํ•œ ๋ฐฐ์—ด
        private var list2: [T] = [] // dequeue๋ฅผ ์œ„ํ•œ ๋ฐฐ์—ด
        
        var isEmpty: Bool {
            return list1.isEmpty && list2.isEmpty
        }
        
        var count: Int {
            return list1.count + list2.count
        }
        
        var front: T? {
            if list2.isEmpty {
                return list1.first
            } else {
                return list2.last
            }
        }
        
        var rear: T? {
            if list2.isEmpty {
                return list1.last
            } else {
                return list2.first
            }
        }
        
        mutating func enqueue(_ element: T) {
            list1.append(element)
        }
        
        mutating func dequeue() -> T?  {
            // list2๊ฐ€ ๋น„์–ด์žˆ์„ ๋•Œ์—๋งŒ list1์˜ ์š”์†Œ๋“ค์„ reversed()๋กœ ๋ณต์‚ฌํ•ด์˜ด
            if list2.isEmpty {
                list2 = list1.reversed()
                list1.removeAll()
            }
            return list2.popLast()
        }
    }

     

    ์—ฌ๊ธฐ์„œ๋Š” ๋ฐฐ์—ด์„ 2๊ฐœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค!

    ๋ฐ”๋กœ enqueue๋ฅผ ์œ„ํ•œ ๋ฐฐ์—ด list1๊ณผ dequeue๋ฅผ ์œ„ํ•œ ๋ฐฐ์—ด list2์ธ๋ฐ์š”,

     

    ๋จผ์ € enqueue ๋ฉ”์†Œ๋“œ๋Š” ์•ž์—์„œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ list1์— ์›์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

    dequeue ๋ฉ”์†Œ๋“œ๊ฐ€ ์กฐ๊ธˆ ๋‹ค๋ฅธ๋ฐ์š”!

    dequeue ๋ฉ”์†Œ๋“œ์—์„œ๋Š” list2๊ฐ€ ๋น„์–ด์žˆ์„ ๋•Œ์—๋งŒ list1 ์›์†Œ๋“ค์„ reversed๋กœ ๋ณต์‚ฌํ•ด์˜ต๋‹ˆ๋‹ค.

    ๊ทธ ํ›„์— list1์„ ๋นˆ ์ƒํƒœ๋กœ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.

    ๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰์œผ๋กœ list2์˜ ์›์†Œ ๊ฐฏ์ˆ˜์™€ ์ƒ๊ด€์—†์ด ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ์›์†Œ๋ฅผ popํ•ด์ฃผ๋ฉด dequeue๊ฐ€ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.

    removeFirst()๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฐฉ๋ฒ•์ด์ฃ !

     

    ๊ทธ๋ฆผ์œผ๋กœ ์„ค๋ช…ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

     

     

    ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— front์™€ rear ์†์„ฑ๋„ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์ด ์‚ด์ง ๋‹ค๋ฅด์ง€๋งŒ, ์‚ฌ์šฉ๋ฐฉ๋ฒ•๊ณผ ์›๋ฆฌ๋Š” ๋˜‘๊ฐ™๋‹ค๋Š”๊ฑฐ!!!

    ์—ฌ๊ธฐ๊นŒ์ง€ ์˜ค๋Š˜๋„ Queue์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•˜๋Š”๋ฐ์š”, ๊ธ€ ์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•˜๊ณ  ํ”ผ๋“œ๋ฐฑ์€ ํ•ญ์ƒ ํ™˜์˜์ž…๋‹ˆ๋‹ค๐Ÿ˜‡

    'Data Structure' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

    [Data Structure] ๊ทธ๋ž˜ํ”„์™€ ํŠธ๋ฆฌ  (0) 2022.03.14
    [Data Structure] ์Šคํƒ (Stack)  (0) 2022.02.09
    [Data Structure] Linked List (Feat. Array)  (0) 2022.01.12

    ๋Œ“๊ธ€

Designed by Tistory.