요구능력
우선순위 큐, 힙
문제풀이
최소힙 문제에서 힙에 구현해놓은 클로저를 이용해서 절댓값 비교와 절댓값이 같을 때 처리만 해주면 된다.
후기
스위프트가 이런거 처리할때는 편리하다.
코드
struct Heap<T: Comparable> {
private var elements: [T] = []
private let sortFunction: (T, T) -> Bool
init (sortFunction: @escaping (T, T) -> Bool){
self.sortFunction = sortFunction
}
var isEmpty: Bool {
return self.elements.count == 1
}
func leftChild(of index: Int) -> Int {
return index * 2
}
func rightChild(of index: Int) -> Int {
return index * 2 + 1
}
func parent(of index: Int) -> Int {
return (index) / 2
}
mutating func diveDown(from index: Int) {
var higherPriority = index
let leftIndex = self.leftChild(of: index)
let rightIndex = self.rightChild(of: index)
if leftIndex < self.elements.endIndex && self.sortFunction(self.elements[leftIndex], self.elements[higherPriority]) {
higherPriority = leftIndex
}
if rightIndex < self.elements.endIndex && self.sortFunction(self.elements[rightIndex], self.elements[higherPriority]) {
higherPriority = rightIndex
}
if higherPriority != index {
self.elements.swapAt(higherPriority, index)
self.diveDown(from: higherPriority)
}
}
mutating func swimUp(from index: Int) {
var index = index
while index != 1 && self.sortFunction(self.elements[index], self.elements[self.parent(of: index)]) {
self.elements.swapAt(index, self.parent(of: index))
index = self.parent(of: index)
}
}
mutating func insert(node: T) {
if self.isEmpty {
self.elements.append(node)
return
}
self.elements.append(node)
self.swimUp(from: self.elements.endIndex - 1)
}
mutating func remove() -> T? {
if self.isEmpty { return nil }
self.elements.swapAt(1, elements.endIndex - 1)
let deleted = elements.removeLast()
self.diveDown(from: 1)
return deleted
}
}
var heap = Heap<Int> { a, b in
if abs(a) < abs(b){
return true
}else if abs(a) == abs(b){
return a < b
}else{
return false
}
}
heap.insert(node: 0)
var str = ""
let n = Int(String(readLine()!))!
for _ in 0..<n{
let x = Int(String(readLine()!))!
if x != 0 {
heap.insert(node: x)
}else{
if let removed = heap.remove() {
str += "\(removed)\n"
}else{
str += "0\n"
}
}
}
print(str)
'Algorithm > 문제풀이_백준' 카테고리의 다른 글
[Swift][누적합] 백준 11659번 (구간 합 구하기4) (0) | 2022.05.30 |
---|---|
[Swift][우선순위 큐] 백준 1655번 (가운데를 말해요) (0) | 2022.05.27 |
[Swift][우선순위 큐] 백준 1927, 11279 (최소힙, 최대힙) (0) | 2022.05.27 |
[Swift][이분탐색] 백준 1300번 (K번째 수) (0) | 2022.05.24 |
[Swift][이분 탐색] 백준 2110번 (공유기 설치) (0) | 2022.05.24 |
댓글