ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

ํ๋Š” ์ด์ „์— ์‚ดํŽด๋ณธ ์Šคํƒ๊ณผ ์œ ์‚ฌํ•œ ์ž๋ฃŒ๊ตฌ์กฐ๋กœ, FIFO ์›์น™์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

์Šคํƒ์€ ๊ฐ€์žฅ ๋‚˜์ค‘์— ์ถ”๊ฐ€๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋จผ์ € ์ถ”์ถœ๋˜์ง€๋งŒ, ํ๋Š” ๊ฐ€์žฅ ๋จผ์ € ์ถ”๊ฐ€๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋จผ์ € ์ถ”์ถœ๋ฉ๋‹ˆ๋‹ค.

 

(์Šคํƒ์— ๋Œ€ํ•ด ์•„์ง ์ž˜ ๋ชจ๋ฅด์‹ ๋‹ค๋ฉด ๊ณต๋ถ€ํ•œ ํ›„ ๋‹ค์‹œ ์˜ค์‹œ๊ธฐ๋ฅผ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด์ „์— ์„ค๋ช…ํ•œ ๋‚ด์šฉ์€ ๊ฐ„๋žตํ•˜๊ฒŒ ๋„˜์–ด๊ฐ‘๋‹ˆ๋‹ค! ๐Ÿ˜Ž)

[Swift] ์Šคํƒ(Stack)์€ ํ”„๋ง๊ธ€์Šค.

 

FIFO๋Š” First In First Out ์›์น™์œผ๋กœ,

๋ฐ์ดํ„ฐ๋ฅผ ๋ฐฐ์—ด์— ๋“ค์–ด์˜จ ์ˆœ์„œ๋Œ€๋กœ ์ถ”๊ฐ€ํ•˜๊ณ (Enqueue), ๊ฐ€์žฅ ๋จผ์ € ์ถ”๊ฐ€๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋จผ์ € ์ถ”์ถœํ•˜๋Š” ๊ฒƒ(Dequeue)์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

 

๋ฌด์Šจ ๋ง์ด์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค๋ฉด…

 

์ด ๊ธ€์˜ ์ œ๋ชฉ์ฒ˜๋Ÿผ ํ๋Š” ์„ ์ฐฉ์ˆœ.์„์ƒ๊ฐํ•˜๋ฉด ์‰ฝ์Šต๋‹ˆ๋‹ค!

์˜ˆ๋ฅผ ๋“ค์–ด, ๋ญ”๊ฐ€๋ฅผ ์„ ์ฐฉ์ˆœ์œผ๋กœ ๊ตฌ๋งคํ•  ๋•Œ ์ƒˆ๋ฒฝ์— ์ผ์ฐ ๋‚˜๊ฐ€์„œ ์ค„์„ ์„œ๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•œ ์›๋ฆฌ์ž…๋‹ˆ๋‹ค.

 

์™œ๋ƒ? ๋จผ์ € ๊ฐ€์•ผ์ง€ ๋จผ์ € ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ์œผ๋‹ˆ๊นŒ์š”!!

 

์ด๋Ÿฌํ•œ ๊ฐœ๋…์„ ๋ฐ”ํƒ•์œผ๋กœ ํ๋Š” FIFO ์›์น™์„ ๋”ฐ๋ฅด๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋กœ ์ดํ•ดํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ •๋ฆฌํ•˜์ž๋ฉด!

ํ๋Š” enqueue ์—ฐ์‚ฐ์œผ๋กœ ๊ฐ’์„ ์ฐจ๋ก€๋Œ€๋กœ ์‚ฝ์ž…ํ•˜๊ณ , dequeue ์—ฐ์‚ฐ์œผ๋กœ ๊ฐ€์žฅ ๋จผ์ € ์ €์žฅ๋œ ๊ฐ’์„ ์‚ญ์ œํ•˜๋Š” ๊ธฐ๋ณธ์ ์ธ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.


Swift๋กœ Queue ๊ตฌํ˜„

๊ธฐ๋ณธ์ ์œผ๋กœ enqueue์™€ dequeue ์—ฐ์‚ฐ์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋ฉฐ, ์ถ”๊ฐ€์ ์œผ๋กœ front, isEmpty, count ์—ฐ์‚ฐ์„ ๊ตฌํ˜„ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

์˜ค๋Š˜์€ ์ฝ”๋“œ๋ฅผ ๋จผ์ € ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 

(ํ•ด๋‹น ์ฝ”๋“œ๋Š” ๋น„ํšจ์œจ์ ์ด๋ผ๋Š” ๊ฒƒ์„ ๋จผ์ € ๋ง์”€๋“œ๋ฆฌ๋ฉฐ..)

struct Queue<T> {
    private var datas: [T] = []
    
    var count: Int {
        return datas.count
    }
    
    var isEmpty: Bool {
        return datas.isEmpty
    }
    
    
    mutating func enqueue(_ element: T) {
            datas.append(element)
        }
    
    mutating func dequeue() -> T? {
        return isEmpty ? nil : datas.removeFirst()
        }
    
}

 

๋ฐฐ์—ด ์ƒ์„ฑ, count, isEmpty, enqueue ๋ฉ”์„œ๋“œ๋Š” ์ด์ „์— ์†Œ๊ฐœ๋œ ์Šคํƒ์—์„œ ์‚ฌ์šฉํ•œ ๋‚ด์šฉ๊ณผ ์ƒ๋‹นํžˆ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ, ์‹œ๊ฐ„ ๋ณต์žก๋„ ๋˜ํ•œ O(1)๋กœ ์ƒ์ˆ˜ ์‹œ๊ฐ„์— ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿฌ๋‚˜, dequeue ๋ฉ”์„œ๋“œ์—์„œ๋Š” ์ƒˆ๋กœ์šด removeFirst() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฉ”์„œ๋“œ๋Š” ๋ฐฐ์—ด์˜ ๋งจ ์ฒ˜์Œ ์š”์†Œ๋ฅผ ์‚ญ์ œํ•˜๊ณ  ํ•ด๋‹น ์š”์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

(๋ฆฌํ„ด ํƒ€์ž…๋„ Self.Element์—ฌ์„œ, ๋นˆ ๋ฐฐ์—ด์ผ ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค!)

 

๊ทธ๋Ÿฌ๋‚˜ ์ฃผ์˜ํ•  ์ ์€ ์ด ๋ฉ”์„œ๋“œ๋Š” ๋ฐฐ์—ด์˜ ๋ฉ”๋ชจ๋ฆฌ ์•ž ๋ถ€๋ถ„์„ ๋น„์›Œ๋ฒ„๋ฆฌ๊ณ , ๋’ค์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋“ค์€ ์•ž์œผ๋กœ ์ด๋™ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ, ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋Š” O(n)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ–๊ธฐ ๋•Œ๋ฌธ์— ํšจ์œจ์ ์ด์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

(์ด๋Ÿฐ ๊ณผ์ •์„ ์˜ค๋ฒ„ํ—ค๋“œ๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.)

removeFirst() | Apple Developer Documentation


์œ„์—์„œ ๊ตฌํ˜„ํ•œ ํ๋ณด๋‹ค ๋” ํšจ์œจ์ ์ธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด๋Š” dequeue์‹œ ๋ฐฐ์—ด์˜ ๋‚˜๋จธ์ง€ ์š”์†Œ์ด ์ด๋™ํ•˜๋Š” ๊ฒƒ์„ ์ตœ์†Œํ™”ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

๋”ฐ๋ผ์„œ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๋ฐฉ์‹์ด ์•„๋‹Œ, Head๋ฅผ ๋„์ž…ํ•˜์—ฌ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ์˜ ์ธ๋ฑ์Šค๋ฅผ ๊ด€๋ฆฌํ•ด์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„์„ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก , ๋ฐฐ์—ด์€ ๊ทธ๋Œ€๋กœ ์œ ์ง€๋ฅผ ์‹œํ‚ค๊ฒ ์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿผ ์ด์ œ ์กฐ๊ธˆ ๋” ํšจ์œจ์ ์ธ ํ๋ฅผ ํ™•์ธํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ฐฐ์—ด๊ณผ head ์ƒ์„ฑ

// ํ์˜ ์š”์†Œ๋“ค์„ ๋‹ด์„ ๋ฐฐ์—ด, head ์ธ๋ฑ์Šค๋ฅผ ์œ ์ง€
private var datas: [T?] = []
private var head: Int = 0

 

์ œ๋„ค๋ฆญ์œผ๋กœ ๊ตฌํ˜„๋œ ๋นˆ ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋ฒˆ์—๋Š” ์˜ต์…”๋„ ํƒ€์ž…์œผ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

dequeueํ•  ์š”์†Œ๋“ค์„ ์‹ค์ œ๋กœ ์‚ญ์ œ์‹œํ‚ค๋Š” ๊ฒƒ์ด ์•„๋‹Œ, nil๊ฐ’์œผ๋กœ ๊ต์ฒดํ•˜์—ฌ ๊ด€๋ฆฌ๋ฅผ ํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

 

๋˜ํ•œ, head ํ”„๋กœํผํ‹ฐ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ์˜ ์ธ๋ฑ์Šค๋ฅผ ๊ณ„์†ํ•ด์„œ ๊ด€๋ฆฌํ•ด์ค๋‹ˆ๋‹ค.

์‚ฝ์ž… (enqueue) - O(1)

// ํ์— ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฉ”์„œ๋“œ
mutating func enqueue(_ element: T) {
    datas.append(element)
}

 

๋ฐฐ์—ด์˜ ์‚ฝ์ž…(enqueue) ๋ฉ”์„œ๋“œ๋Š” ์Šคํƒ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ append(_ newElement: Element) ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์ด๋Š” ๋ฐฐ์—ด์˜ ๋์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ง๋ถ™์ด๋Š” ๊ฒƒ์œผ๋กœ, ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ์—๋Š” O(1)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค.

(๋ฐฐ์—ด์˜ ์šฉ๋Ÿ‰(capacity)๊ฐ€ ๋ถ€์กฑํ•  ๋•Œ๋Š” O(n)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๊ฒƒ์€ ์Šคํƒ ๊ธ€์—์„œ ์„ค๋ช… ํ–ˆ์Šต๋‹ˆ๋‹ค!)

 

๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค๋ช…ํ•˜๋ฉด, ํ˜„์žฌ ๋ฐฐ์—ด์˜ ์šฉ๋Ÿ‰์ด ๋ถ€์กฑํ•˜๋‹ˆ๊นŒ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด๋กœ ์ด์‚ฌ๋ฅผ ๊ฐ€์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

append(_:) | Apple Developer Documentation

์‚ญ์ œ (dequeue) - O(1)

// ํ์—์„œ ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ
mutating func dequeue() -> T? {
    // ํ๊ฐ€ ๋น„์–ด์žˆ๊ฑฐ๋‚˜ head๊ฐ€ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋ฉด nil ๋ฐ˜ํ™˜
    guard head < datas.count, let element = datas[head] else { return nil }
    
    datas[head] = nil // head์— ํ•ด๋‹นํ•˜๋Š” ์š”์†Œ๋ฅผ nil๋กœ ์„ค์ •
    head += 1 // head๋ฅผ ์ฆ๊ฐ€์‹œ์ผœ ๋‹ค์Œ ์š”์†Œ๋กœ ์ด๋™
    
    let percentage = Double(head) / Double(datas.count)
    
    // head๊ฐ€ ๋ฐฐ์—ด์˜ ์•ž๋ถ€๋ถ„์— ์š”์†Œ๊ฐ€ ๋งŽ์ด ๋‚จ์•„์žˆ์œผ๋ฉด ๋ฐฐ์—ด์„ ์ •๋ฆฌ
    if percentage > 0.25 && head > 50 {
        datas.removeFirst(head) // head ๊ฐœ์ˆ˜๋งŒํผ ์š”์†Œ๋ฅผ ๋ฐฐ์—ด์—์„œ ์ œ๊ฑฐ
        head = 0
    }
    
    return element
}

 

dequeue ๋ฉ”์„œ๋“œ๋Š” ์‚ญ์ œํ•  ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋Š”๋ฐ ์‚ญ์ œ๋ฅผ ์‹œ๋„ํ•˜๋ฉด ๋™์ž‘์„ ๋ง‰์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ, ํ๊ฐ€ ๋น„์–ด์žˆ๊ฑฐ๋‚˜ head๊ฐ€ ๋ฐ์ดํ„ฐ ๋ฐฐ์—ด์˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋ฉด nil์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

 

head๊ฐ€ ๋ฐฐ์—ด์˜ count์™€ ๊ฐ™๊ฑฐ๋‚˜ ํฐ ๊ฒฝ์šฐ๋Š” ํ๊ฐ€ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•œ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ ์ƒํƒœ์—์„œ head๊ฐ€ ํ์˜ count์™€ ๊ฐ™๊ฑฐ๋‚˜ ํฐ ๊ฒฝ์šฐ์—๋Š” ํ•ด๋‹น ํ๊ฐ€ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋Š” ์ƒํƒœ์ž…๋‹ˆ๋‹ค.

(์•„๋ž˜๋Š” count์™€ head๊ฐ€ 4๋กœ ๊ฐ™์€ ์ƒํ™ฉ์ž…๋‹ˆ๋‹ค.)

[nil, nil, nil, nil]
		   head

 

๋ฐฐ์—ด์˜ ๋ฒ”์œ„ ๋‚ด์—์„œ dequeue๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด, head ์ธ๋ฑ์Šค์˜ ๋ฐ์ดํ„ฐ๋ฅผ nil๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  head๋ฅผ ๋‹ค์Œ ์ธ๋ฑ์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก +1์„ ํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. 

 

๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ ๋™์ž‘๋งŒ ๊ณ„์†ํ•˜๋ฉด ๋ฐฐ์—ด์€ ๊ณ„์†ํ•ด์„œ nil๋กœ ์„ค์ •๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋˜๋Š”๋ฐ, ์ด๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ ์ ˆํ•œ ์‹œ์ ์— dequeue๋œ ์ž๋ฃŒ๋“ค์„ ์ •๋ฆฌํ•˜๋Š” ์ž‘์—…์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

 

์ž‘์—…์€ ํ™˜๊ฒฝ์— ๋งž์ถ”์–ด ์ ์ ˆํ•œ ๋•Œ์— ์ˆ˜ํ–‰๋˜๋„๋ก ์„ค์ •๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

์—ฌ๊ธฐ์„œ๋Š” ๋ฐฐ์—ด์— ์ตœ์†Œ 50๊ฐœ์˜ ์š”์†Œ๊ฐ€ ์žˆ์–ด์•ผ ํ•˜๋ฉฐ(๋ฐฐ์—ด ํฌ๊ธฐ๊ฐ€ ์ž‘์„ ๊ฒฝ์šฐ์—๋Š” ๊ณต๊ฐ„ ๋‚ญ๋น„๊ฐ€ ํฐ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค), ๊ทธ ์ค‘ 25% ์ด์ƒ์ด ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์— ํ•ด๋‹น ๋ถ€๋ถ„์„ nil๋กœ ์„ค์ •๋œ ๋ฐ์ดํ„ฐ๋“ค์„ ์ œ๊ฑฐํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ๊ตฌํ˜„ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

๋งˆ์ง€๋ง‰์œผ๋กœ, ์‚ญ์ œ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฆฌํ„ดํ•ด์ฃผ๋ฉฐ ๋ฉ”์„œ๋“œ๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.


โญ๏ธโญ๏ธ ์ฃผ์˜ โญ๏ธโญ๏ธ

๋งŽ์€ ๋ธ”๋กœ๊ทธ ๊ธ€์—์„œ head์™€ count์˜ ๊ฐ’์ด ๊ฐ™์„ ๋•Œ๋„ ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚ค๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์€๋ฐ ์ฃผ์˜ํ•˜์„ธ์š”!

์ธ๋ฑ์Šค๋Š” 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ณ , count๋Š” 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ ํ—ท๊ฐˆ๋ฆด์ˆ˜ ์žˆ๋Š”๋ฐ..

(๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ dequeueํ•˜๊ณ  ํ•œ ๋ฒˆ ๋” ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋ฐฐ์—ด์—์„œ ๋ฒ—์–ด๋‚œ ์ธ๋ฑ์Šค๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.)

// ์ž˜๋ชป๋œ ์ฝ”๋“œ ์˜ˆ์‹œ
guard head <= datas.count, let element = datas[head] else { return nil }

 

์กฐํšŒ (count, isEmpty, front) - O(1)

// ํ˜„์žฌ ํ์— ์žˆ๋Š” ์š”์†Œ์˜ ๊ฐœ์ˆ˜
var count: Int {
    return datas.count - head
}

// ํ๊ฐ€ ๋น„์–ด์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋ฐ˜ํ™˜
var isEmpty: Bool {
    return count == 0
}

// ํ˜„์žฌ ํ์˜ ๋งจ ์•ž์— ์žˆ๋Š” ์š”์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ
func front() -> T? {
    if isEmpty {
        return nil
    } else {
        return datas[head]
    }
}

 

์—ฌ๊ธฐ๋„ ์ค‘์š”ํ•˜๊ฒŒ ๋ด์ฃผ์„ธ์š”! โญ๏ธโญ๏ธโญ๏ธ

(์—ฌ๋Ÿฌ ๋ธ”๋กœ๊ทธ๋“ค์ด ์—ฌ๊ธฐ๋ฅผ ๊ฝค ํ‹€๋ฆฌ์‹  ๊ฑฐ ๊ฐ™์€๋ฐ.. ์ œ๊ฐ€ ๋งž๊ฒ ์ฃ ..?ใ…Ž)

 

๋งŽ์€ ๋ถ„๋“ค์ด ์•„๋ž˜ ์ฃผ์˜ ์ฝ”๋“œ๋ฅผ ๋ณด์‹œ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๊ทธ๋ƒฅ ํ ๋ฐฐ์—ด์˜ count์™€ isEmpty ํ”„๋กœํผํ‹ฐ๋ฅผ ์ด์šฉํ•˜์‹œ๋”๋ผ๊ณ ์š” ?! 

๊ทธ๋Ÿฌ๋‚˜, ์ด ๊ฒฝ์šฐ์—๋Š” ์กฐ๊ธˆ ๋” ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค!

 

์šฐ๋ฆฌ๋Š” ํ˜„์žฌ ํ์˜ dequeue ๋ฉ”์„œ๋“œ๋ฅผ ๋” ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด

๋ฐ์ดํ„ฐ๋ฅผ ์‹ค์ œ๋กœ ๋ฐฐ์—ด์—์„œ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, nil๋กœ ๋ฐ”๊พธ๊ณ  head๋กœ ์ฒซ ๋ฒˆ์งธ ๋ฐ์ดํ„ฐ ์ธ๋ฑ์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— datas ๋ฐฐ์—ด์—๋Š” nil์ธ ๋ฐ์ดํ„ฐ๋“ค์ด ์กด์žฌํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค!

 

๋ฐฐ์—ด์˜ count์™€ isEmpty ํ”„๋กœํผํ‹ฐ๋Š” nil์„ ์ œ์™ธํ•˜๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ์šฐ๋ฆฌ๋Š” ์ด nil๋กœ ๋ฐ”๋€ ๋ฐ์ดํ„ฐ๋“ค๋„ ์‹ ๊ฒฝ ์จ์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

๋”ฐ๋ผ์„œ ์œ„์˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ count๋ฅผ ๊ณ„์‚ฐํ•  ๋•Œ head๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ๋ฐ˜์˜ํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

์•„๋ž˜์™€ ๋‹ฌ๋ฆฌ ์ œ๋Œ€๋กœ ๋‚˜์˜ค๋Š” ๊ฒƒ ๊ฐ™์ฃ  ?!


โญ๏ธโญ๏ธ ์ฃผ์˜ โญ๏ธโญ๏ธ

// ์ž˜๋ชป๋œ ์ฝ”๋“œ
public var count: Int {
    return datas.count
}

public var isEmpty: Bool {
    return datas.isEmpty
}

 

์ด๋Œ€๋กœ ์ฝ”๋“œ๋ฅผ ๋™์ž‘ํ•ด๋ณด๋ฉด, ๊ฐ’์ด ์ œ๋Œ€๋กœ ๋‚˜์˜ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค!


๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ Queue ๋งŒ๋“ค๊ธฐ

์œ„์— ์ฝ”๋“œ๊ฐ€ ์•„๋‹Œ, ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ๋„ ๋งŽ์ด ๋งŒ๋“œ์‹œ๋˜๋ฐ..

์ €๋Š” ์ผ๋‹จ ์ฐธ๊ณ ๋งŒ ํ• ๊ฒŒ์š”.๐Ÿ˜…

 

- ๋‘ ๊ฐœ์˜ ์Šคํƒ์„ ์ด์šฉํ•˜์—ฌ Queue ๊ตฌํ˜„ํ•˜๊ธฐ

[์ž๋ฃŒ๊ตฌ์กฐ] Swift ๋กœ Queue ๊ตฌํ˜„ํ•˜๊ธฐ;

 

- ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ด์šฉํ•ด์„œ ๊ตฌํ˜„ํ•˜๊ธฐ

์Šค์œ„ํ”„ํŠธ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ 3: ํ(Queue)


Swift ์ „์ฒด ์ฝ”๋“œ

struct Queue<T> {
    // ํ์˜ ์š”์†Œ๋“ค์„ ๋‹ด์„ ๋ฐฐ์—ด, head ์ธ๋ฑ์Šค๋ฅผ ์œ ์ง€
    private var datas: [T?] = []
    private var head: Int = 0
    
    // ํ˜„์žฌ ํ์— ์žˆ๋Š” ์š”์†Œ์˜ ๊ฐœ์ˆ˜
    var count: Int {
        return datas.count - head
    }
    
    // ํ๊ฐ€ ๋น„์–ด์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋ฐ˜ํ™˜
    var isEmpty: Bool {
        return count == 0
    }
    
    // ํ์— ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฉ”์„œ๋“œ
    mutating func enqueue(_ element: T) {
        datas.append(element)
    }
    
    // ํ์—์„œ ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ
    mutating func dequeue() -> T? {
        // ํ๊ฐ€ ๋น„์–ด์žˆ๊ฑฐ๋‚˜ head๊ฐ€ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋ฉด nil ๋ฐ˜ํ™˜
        guard head < datas.count, let element = datas[head] else { return nil }
        
        datas[head] = nil // head์— ํ•ด๋‹นํ•˜๋Š” ์š”์†Œ๋ฅผ nil๋กœ ์„ค์ •
        head += 1 // head๋ฅผ ์ฆ๊ฐ€์‹œ์ผœ ๋‹ค์Œ ์š”์†Œ๋กœ ์ด๋™
        
        let percentage = Double(head) / Double(datas.count)
        
        // head๊ฐ€ ๋ฐฐ์—ด์˜ ์•ž๋ถ€๋ถ„์— ์š”์†Œ๊ฐ€ ๋งŽ์ด ๋‚จ์•„์žˆ์œผ๋ฉด ๋ฐฐ์—ด์„ ์ •๋ฆฌ
        if percentage > 0.25 && head > 50 {
            datas.removeFirst(head) // head ๊ฐœ์ˆ˜๋งŒํผ ์š”์†Œ๋ฅผ ๋ฐฐ์—ด์—์„œ ์ œ๊ฑฐ
            head = 0
        }
        
        return element
    }
    
    // ํ˜„์žฌ ํ์˜ ๋งจ ์•ž์— ์žˆ๋Š” ์š”์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ
    func front() -> T? {
        if isEmpty {
            return nil
        } else {
            return datas[head]
        }
    }
}

 


๋งˆ๋ฌด๋ฆฌ

๊ฐ„๋‹จํžˆ ๋งˆ๋ฌด๋ฆฌํ•  ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ, ์ฝ”๋“œ ์ž‘์„ฑ๊ณผ ์‹คํ—˜์„ ๊ฑฐ์ณ๋ณด๋‹ˆ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

๋•๋ถ„์— ๋‹ค๋ฅธ ๋ธ”๋กœ๊ทธ์—์„œ๋„ ์ž˜๋ชป๋œ ๋‚ด์šฉ์„ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค!

 

์•ž์œผ๋กœ๋Š” ๋ธ”๋กœ๊ทธ ๊ธ€์„ ๋ฌด์กฐ๊ฑด ๋ฏฟ์ง€ ๋ง๊ณ  ๋„๊ตฌ๋กœ ํ™œ์šฉํ•˜๋˜, ๋ฐ˜๋“œ์‹œ ์ •ํ™•ํ•œ ์ •๋ณด์ธ์ง€ ํ™•์ธํ•˜๋Š” ์Šต๊ด€์„ ๊ฐ–๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ด๋ณด์ž…๋‹ˆ๋‹ค.

 

์šฐ๋ฆฌ๋Š” ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ๋” ์‹ ๋ขฐํ•˜๊ณ , ์ •๋ณด๋ฅผ ๊ฒ€์ฆํ•˜๋Š” ๊ณผ์ •์„ ์†Œํ™€ํžˆํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ’ก


์ž˜๋ชป๋œ ๋‚ด์šฉ์ด๋‚˜ ๊ถ๊ธˆํ•˜์‹  ์ ์ด ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€ ๋‚จ๊ฒจ์ฃผ์„ธ์š”. ๐Ÿค“

์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ“ ์ฐธ๊ณ  ์ž๋ฃŒ

ํ•œ๊ตญ์™ธ๋Œ€ ์‹ ์ฐฌ์ˆ˜ ๊ต์ˆ˜๋‹˜์˜ Data Structures with Python ๊ฐ•์˜

[์ž๋ฃŒ๊ตฌ์กฐ] Swift๋กœ ๊ตฌํ˜„ํ•˜๋Š” Queue (ํ)

Swift) ํ(Queue) ๊ตฌํ˜„ ํ•ด๋ณด๊ธฐ

https://github.com/kodecocodes/swift-algorithm-club/tree/master/Queue