๐Ÿ“ ์ฝ”ํ…Œ/BOJ

[Swift] ๋ฐฑ์ค€2164

JerryiOS 2023. 3. 24. 17:47

import Foundation

/// ์นด๋“œ๋Š” 1 ~ N๊นŒ์ง€ ๋ฒˆํ˜ธ ๋ถ™์–ด์žˆ์Œ
/// 1๋ฒˆ ์นด๋“œ๊ฐ€ ์ œ์ผ ์œ„, N๋ฒˆ์นด๋“œ๊ฐ€ ์ œ์ผ ์•„๋ž˜
/// ์•„๋ž˜ ์‚ฌํ•ญ์„ ๋ฐ˜๋ณต
/// 1. ์ œ์ผ ์œ„์˜ ์นด๋“œ๋ฅผ ๋ฐ”๋‹ฅ์— ๋ฒ„๋ฆผ
/// 2. ์ œ์ผ ์œ„์˜ ์นด๋“œ๋ฅผ ์ œ์ผ ์•„๋ž˜ ์นด๋“œ ๋ฐ‘์œผ๋กœ ์˜ฎ๊น€
/// ๋งˆ์ง€๋ง‰์œผ๋กœ ๋‚จ๊ฒŒ๋˜๋Š” ์นด๋“œ๋Š” ๋ญ๋ƒ?

let N = Int(readLine()!)!

var cards = Array(1...N)

var queue = Queue<Int>()

for i in 1...N {
    queue.enqueue(i)
}

while queue.count >= 2 {
    
    queue.dequeue()
    if let dequeue = queue.dequeue() {
        queue.enqueue(dequeue)
    }
}

print(queue.dequeue()!)

struct Queue<T> {
    private var queue: [T?] = []
    private var head: Int = 0
    
    public var count: Int {
        return queue.count
    }
    
    public var isEmpty: Bool {
        return queue.isEmpty
    }
    
    public mutating func enqueue(_ element: T) {
        queue.append(element)
    }
    
    @discardableResult
    public mutating func dequeue() -> T? {
        guard head <= queue.count, let element = queue[head] else { return nil }
        queue[head] = nil
        head += 1
        
        if head > (count / 4) {
            queue.removeFirst(head)
            head = 0
        }
        return element
    }
}

์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ O(1)์ธ queue๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๊ฒฐํ–ˆ๋‹ค.

๋ฐ˜์‘ํ˜•