알고리즘
[Swift 알고리즘] - Stack으로 Queue만들기
Peppo
2022. 10. 14. 23:12
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
- s1.count가 0 이면 더이상 뺄게 없으므로 nil을 리턴
- s1.count가 1 이면 그것만 빼서 리턴
- s1.count가 2이상이면 for 루프를 이용해서 s1 첫번째 인덱스를 제외하고 s2로 다 push
- for 루프에서 s1 첫번째 인덱스만 남게 되면 var savedValue 에 s1.pop()을 이용해 할당 --> s1은 요소가 없는상태
- s2로 몰려온 요소들을 다시 s1으로 push (s1 배열 순서 원상복구)
제네릭을 어떻게 다뤄야 하는건지 조금은 숙달이 된것 같다.
코드가 지저분해 보이는데 리팩토링해서 조금 보완해봐야겠다.
728x90