집합을 통해 캐시를, LRU로 캐시 미스 경우 삭제할 캐시를 리스트 형식의 큐로 관리했다. 힙, 큐 등 일반 리스트가 아닌 자료구조를 사용할 때 LRU로 "가장 최신" 사용한 원소를 맨 뒤로, "삭제할 수 있는" 원소를 맨 앞으로 자동으로 오게 할 수 있을 것 같다.
func solution(_ cacheSize:Int, _ cities:[String]) -> Int {
var total = 0
var cache = Set<String>()
var cacheArray = [String]()
for city in cities {
let city = city.lowercased()
if cache.contains(city) {
total += 1
guard let idx = cacheArray.firstIndex(of: city) else { continue }
cacheArray.remove(at: idx)
cacheArray.append(city)
} else {
total += 5
if cache.count < cacheSize {
cache.insert(city)
cacheArray.append(city)
} else if !cache.isEmpty {
let removedItem = cacheArray.removeFirst()
cache.remove(removedItem)
cache.insert(city)
cacheArray.append(city)
}
}
}
return total
}