https://school.programmers.co.kr/learn/courses/30/lessons/17680
#include <string>
#include <vector>
#include <unordered_map>
#include <algorithm>
#include <list>
using namespace std;
#define CACHE_HIT 1
#define CACHE_MISS 5;
class LRU
{
public:
explicit LRU(int n)
{
LRUMaxSize = n;
LRUTime = 0;
}
void refer(string n)
{
// 캐시 내에 없을 경우
if (LRUMap.find(n) == LRUMap.end())
{
// 캐시가 꽉 찼을 경우
if (LRUList.size() >= LRUMaxSize)
{
// 리스트에서 가장 오래 사용되지 않은 요소 pop
LRUMap.erase(LRUList.front());
// 참조도 함께 삭제
LRUList.pop_front();
}
LRUTime += CACHE_MISS;
}
// 캐시 내에 있을 경우 해당 요소 삭제
else
{
LRUList.erase(LRUMap[n]);
LRUTime += CACHE_HIT;
}
// 새로운 요소 x를 push, 참조도 updqte
LRUList.push_back(n);
LRUMap[n] = --LRUList.end();
}
int GetTime() noexcept { return LRUTime; }
private:
list<string> LRUList; // 데이터를 저장할 list
unordered_map<string, list<string>::iterator> LRUMap; // 참조를 저장할 map
int LRUMaxSize; // 최대 용량
int LRUTime; // 실행시간
};
int solution(int cacheSize, vector<string> cities) {
if (!cacheSize) return cities.size() * CACHE_MISS;
LRU lru(cacheSize);
for_each(cities.begin(), cities.end(), [&](auto& str)
{
transform(str.begin(), str.end(), str.begin(), ::tolower);
lru.refer(str);
});
return lru.GetTime();
}
'Coding Test > Programmers' 카테고리의 다른 글
[Programmers] (2019 카카오 개발자 겨울 인턴십) Lv 2. 튜플 (0) | 2023.06.16 |
---|---|
[Programmers] (해시) Lv 2. 의상 (0) | 2023.06.15 |
[Programmers] Lv 2. 행렬의 곱셈 (0) | 2023.06.14 |
[Programmers] (월간 코드 챌린지 시즌3) Lv 2. n^2 배열 자르기 (0) | 2023.06.13 |
[Programmers] Lv 2. 연속 부분 수열 합의 개수 (0) | 2023.06.12 |
댓글