문제

 

풀이 코드

struct Queue<T> {
    private var elements: [T] = []
    private var reverseElement: [T] = []

    public var size: Int {
        return elements.count + reverseElement.count
    }

    public mutating func push(_ element: T) {
        return elements.append(element)
    }

    public mutating func pop() -> T? {
        if reverseElement.isEmpty {
            reverseElement = elements.reversed()
            elements.removeAll()
        }
        return reverseElement.isEmpty ? nil : reverseElement.popLast()
    }
}

var queue = Queue<Int>()
let N = Int(readLine()!)!

for n in 1...N {
    queue.push(n)
}

while queue.size != 1 {
    queue.pop()
    if let item = queue.pop() {
        queue.push(item)
    }
}

print(queue.pop()!)

 

풀이 과정

그냥 Queue를 이용하여 풀면 될거 같았다.

큐를 이용해 간단하게 구현하였지만 시간초과가 발생했다.

그 이유는 removeFirst 때문인데 첫 요소를 제거하면 다음의 엘리먼트들을 앞으로 한칸씩 땡겨와야 하기 때문에 연산시간이 오래걸린다.

그래서 removeElement 라는 변수를 큐 구조체내에 따로 구현해 주고, reversed 를 통해 마지막 요소를 제거하도록 했더니 시간초과 문제가 해결 되었다.

 

알고리즘을 풀때 첫요소나 중간 요소를 제거하면 그만큼 연산시간이 오래 걸린다는것을 배웠다.

+ Recent posts