2022. 10. 28. 09:48ใAlgorithm
๋ฐฑ์ค - ๊ฐ์์ค ๋ฐฐ์ (Swift)
๋ฌธ์ ์ค๋ช
https://www.acmicpc.net/problem/11000
๋์ ํ์ด
์ฐ์ ์์ ํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ด์ฉํ ๋ฌธ์ ํ์ด์ด๋ค.
์ ๋ ฅ๊ฐ์ด 100,000์ด ๋์ด๊ฐ ๋๋ ์ฐ์ ์์ํ๊ฐ์ ์๊ฐ๋ณต์ก๋๊ฐ ์ ์ ์๋ฃ๊ตฌ์กฐ๋ฅผ ๋ ์ฌ๋ ค์ผํ๋ค.
์ด ๋ฌธ์ ๋ฅผ ํธ๋๋ฐ ์ด๋ ค์ ๋ ์ ์ ๋๊ฐ์ง์ด๋ค.
1. ๊ฐ์๋ฅผ ์์์๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๋ ๊ฒ.
2. ์ฐ์ ์์ ํ๋ฅผ ์ด์ฉํ๋ ๊ฒ.
์ฒซ ๋ฒ์งธ๋ฅผ ์๊ฐํ๊ธฐ์ ์ ์ฒ์์ ๊ฐ์๋ฅผ ๋๋์๊ฐ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ์ ํ๋ค. ํ์ง๋ง ์ต์์ ๊ฐ์์ค์ ์ฌ์ฉํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ ์ผ ๋นจ๋ฆฌ ์์ํ๋ ๊ฒ์ ๋จผ์ ์์ํ๋ ๊ฒ ๊ฐ์ฅ ๊ทธ๋ฆฌ๋ํ๋ค.
๋ ๋ฒ์งธ๋ ์ฌ๋๋ค์ด ๊ตฌํํด๋์ ์ฐ์ ์์ ํ๋ฅผ ์ด์ฉํ๋๋ฐ peek()๋ฉ์๋๋ remove(at:)๋ฑ ์ฌ์ฉ๋ฒ์ ๋ชฐ๋ผ์ ํด๋ฉจ์๋ค.
์ด ๋ ๊ฐ์ง๋ฅผ ํด๊ฒฐํ๋ ๋ฌธ์ ๊ฐ ํ๋ ธ๋ค.
public struct Heap<T> {
private var nodes = [T]()
private var orderCriteria: (T, T) -> Bool
public init(sort: @escaping (T, T) -> Bool) {
// ์ต๋ ํ์ธ์ง ์ต์ ํ์ธ์ง ๊ธฐ์ค์ ์ก๋๋ค.
self.orderCriteria = sort
}
public init(array: [T], sort: @escaping (T, T) -> Bool) {
self.orderCriteria = sort
configureHeap(from: array)
}
public var count: Int {
return nodes.count
}
public func peek() -> T? {
return nodes.first
}
public mutating func insert(_ value: T) {
nodes.append(value)
shiftUp(nodes.count - 1)
}
public mutating func remove() -> T? {
guard !nodes.isEmpty else { return nil }
if nodes.count == 1 {
return nodes.removeLast()
} else {
let value = nodes[0]
nodes[0] = nodes.removeLast()
shiftDown(0)
return value
}
}
public mutating func remove(at index: Int) -> T? {
guard index < nodes.count else { return nil }
let lastIndex = nodes.count-1
if index != lastIndex {
nodes.swapAt(index, lastIndex)
shiftDown(from: index, until: lastIndex)
shiftUp(index)
}
return nodes.removeLast()
}
// ๋ณ์๋ฅผ ์ง์ ๋ณ๊ฒฝํด์ผ ํ๊ธฐ ๋๋ฌธ์ mutating ์ ์ฌ์ฉํ๋ค.
private mutating func configureHeap(from array: [T]) {
nodes = array
/**
* ํ ํธ๋ฆฌ์์ n/2 - 1 ์ ํ๋ ์ ์ธต์๊ฐ ๋๋ค.
* shiftDown์ ํ๋ฉด์ ์๋ฆฌ๋ฅผ ์ก์ ๊ฒ์ด๊ธฐ ๋๋ฌธ์
* ๋ง์ง๋ง leaf ๋
ธ๋๋ค์ ํ ํ์๊ฐ ์๋ค.
*/
for i in stride(from: nodes.count/2 - 1, through: 0, by: -1) {
shiftDown(i)
}
}
private func parentIndex(ofIndex i: Int) -> Int {
return (i - 1) / 2
}
private func leftChildIndex(ofIndex i: Int) -> Int {
return 2*i + 1
}
private func rightChildIndex(ofIndex i: Int) -> Int {
return 2*i + 2
}
/**
* shiftUp์ ์์ ๊ณผ ๋ถ๋ชจ๋ฅผ ๋น๊ตํด ๋ฐ๊ฟ์ค๋ค.
*/
private mutating func shiftUp(_ index: Int) {
var childIndex = index
let child = nodes[childIndex] // ์ฒ์์ ๋
ธ๋๋ฅผ ์ ์ฅํด๋๊ณ ์ธ๋ฑ์ค๋ฅผ ๊ตฌํ ํ ๋ฐ๊ฟ์ค๋ค.
var parentIndex = self.parentIndex(ofIndex: index)
while childIndex > 0 && orderCriteria(child, nodes[parentIndex]) {
nodes[childIndex] = nodes[parentIndex]
childIndex = parentIndex
parentIndex = self.parentIndex(ofIndex: childIndex)
}
nodes[childIndex] = child
}
/**
* shiftDown์ left, right ์์ ์ค ์ ํฉํ ๋
์์ด ์์ผ๋ฉด ๋ฐ๊พธ๋ฉด์ ๋ฐ๋ฅ๊น์ง ๋ด๋ ค๊ฐ๋ค.
*/
private mutating func shiftDown(from index: Int, until endIndex: Int) {
let leftChildIndex = self.leftChildIndex(ofIndex: index)
let rightChildIndex = leftChildIndex + 1
var first = index
if leftChildIndex < endIndex && orderCriteria(nodes[leftChildIndex], nodes[first]) {
first = leftChildIndex
}
if rightChildIndex < endIndex && orderCriteria(nodes[rightChildIndex], nodes[first]) {
first = rightChildIndex
}
if first == index { return }
nodes.swapAt(index, first)
shiftDown(from: first, until: endIndex)
}
private mutating func shiftDown(_ index: Int) {
shiftDown(from: index, until: nodes.count)
}
}
var lectures = [(Int, Int)]()
for _ in 0..<Int(readLine()!)! {
let input = readLine()!.split(separator: " ").map { Int(String($0))! }
lectures.append((input[0], input[1]))
}
lectures.sort(by: <)
var heap = Heap<Int>(sort: <)
heap.insert(lectures[0].1)
for i in 1..<lectures.count {
if lectures[i].0 < heap.peek()! {
heap.insert(lectures[i].1)
} else {
heap.remove(at: 0)
heap.insert(lectures[i].1)
}
}
print(heap.count)
'Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐฑ์ค - ํฐ๋ฆฐ๋๋กฌ ๋ง๋ค๊ธฐ(Swift) (0) | 2022.10.28 |
---|---|
๋ฐฑ์ค - ์ธํ์ ์ฌ์ฅ ๋ํ(Swift) (0) | 2022.10.28 |
๋ฐฑ์ค - ์ ์ธ(Swift) (1) | 2022.10.27 |
๋ฐฑ์ค - ํ๋ ฌ(Swift) (0) | 2022.10.27 |
๋ฐฑ์ค - ์๋ฆฌ๊ณต ํญ์น(Swift) (0) | 2022.10.26 |