티스토리 뷰

728x90

 

문제 사진

구조체 Stack 2개를 사용해서 Queue의 기능을 구현

내 풀이

struct Stack<T> {
    
    private var stack: [T] = []
    
    public var isEmpty: Bool {
        return stack.isEmpty
    }
    
    public var count: Int {
        return stack.count
    }
    
    public mutating func push(_ el: T) {
        stack.append(el)
    }
    
    public mutating func pop() -> T? {
        return isEmpty ? nil : stack.popLast()
    }
    
}

struct Queue<T> {
    
    var s1 = Stack<T>()
    var s2 = Stack<T>()
    
    public mutating func inQueue(_ el: T) {
        s1.push(el)
    }
    
    public mutating func deQueue() -> T? {
        var savedValue: T?

        if s1.isEmpty {                 // 1
            return nil
        } else if s1.count == 1 {       // 2
            return s1.pop()!
        }

        for _ in 1...s1.count {         // 3
            if s1.count > 1 {
                s2.push(s1.pop()!)
            } else {
                savedValue = s1.pop()!
                for _ in 1...s2.count {
                    s1.push(s2.pop()!)
                }
                return savedValue
            }
        }
        return nil
    }
    
}

var queue1 = Queue<Int>()
queue1.inQueue(1) // 1
queue1.inQueue(2) // 2

queue1.deQueue()  // 1
queue1.deQueue()  // 2
queue1.deQueue()  // nil
queue1.deQueue()  // nil

 

  1. s1.count가 0 이면 더이상 뺄게 없으므로 nil을 리턴
  2. s1.count가 1 이면 그것만 빼서 리턴
  3. s1.count가 2이상이면 for 루프를 이용해서 s1 첫번째 인덱스를 제외하고 s2로 다 push
    • for 루프에서 s1 첫번째 인덱스만 남게 되면 var savedValue 에 s1.pop()을 이용해 할당  --> s1은 요소가 없는상태 
    • s2로 몰려온 요소들을 다시 s1으로 push (s1 배열 순서 원상복구)

 

 

제네릭을 어떻게 다뤄야 하는건지 조금은 숙달이 된것 같다.

코드가 지저분해 보이는데 리팩토링해서 조금 보완해봐야겠다. 

728x90