function solution(cacheSize, cities) {
let answer=0;
let cache=[];
if (cacheSize===0){
return cities.length*5;
}
while(cities.length>0){
let city=cities.shift().toLowerCase();
if (cache.includes(city)){
cache.splice(cache.indexOf(city),1);
cache.push(city);
answer+=1;
}else{
if (cache.length===cacheSize){
cache.shift();
}
cache.push(city);
answer+=5;
}
}
return answer;
}
내 코드 설명
정처기를 공부하고 나니 보다 이 문제를 더 잘 이해하고 풀 수 있게 되었다.
다만 LRU(Least Recently Used)를 LFU(Least Frequently Used)로 잘못 읽어서 중간에 멘붕이 왔었다.
일단 이 문제는 LRU만 알면 생각보다 간단하다는거. 예전에 처음 봤을 때는 멘붕 왔었는데.
cacheSize가 0이면 저장해둘 수 있는 공간이 없으니까 실행시간은 무조건 5씩 든다.
이제 cities에서 맨 앞 요소(city라고 지정)를 하나씩 꺼내면서 실행시간을 구하면 되는데 이 문제에서는 toLowerCase()를 꼭 해주어야 한다. 테스트케이스에서 자꾸 실패가 뜨길래 뭔가 했더니 cities에 newyork NewYork 이런 식으로 일관성 없이 들어가 있었다.
자 이렇게 shift()로 맨 앞 요소를 꺼내주고 toLowerCase()까지 해주었다면 cache.includes()로 cache에 이 요소가 있는지 확인해야 한다. 만약에 존재한다면 이 요소를 맨 뒤로 보내주어야 하므로 cache.splice(cache.indexOf(city),1)를 한 후, cache.push(city)를 해 주어야 한다.
만약에 cache에 존재하지 않는다면 cache가 꽉 차 있는지 확인하고, 꽉 차 있다면 cache.shift()로 맨 앞에 있는 요소를 빼주고 city를 push 해준다.