캐시-2018 kakao blind recruitment
도시는 대소문자를 구분하지 않으므로, 입력받은 도시이름 배열에서 모든 도시를 소문자로 변환한다.
가장 최근에 사용된 도시는 캐시의 맨 뒤에 저장하도록 하였다.
맨 앞에 있는 도시는 캐시 미스시 교체 대상이 되는 도시이다.
도시가 캐시에 있다면, 캐시에 있는 도시는 가장 최근에 사용된 것이므로, 위치를 캐시의 맨 뒤로 옮긴다.
도시가 캐시에 없을 땐, 캐쉬의 맨 뒤에 도시를 추가해야 한다. 그 전에, 캐시에 있는 도시의 수가 캐시 크기를 이상인지 확인해야 한다. 도시의 수가 캐시 크기 이상이라면, 캐시에서 가장 앞에 있는 도시를 삭제한다. 그 후, 캐쉬의 맨 뒤에 도시를 추가한다.
const HIT = 1;
const MISS = 5;
const isInCache = (cityList, target) =>
cityList.some((city) => city === target);
const removeFromCache = (cityList, target) =>
cityList.filter((city) => city !== target);
function solution(cacheSize, cities) {
if (cacheSize === 0) {
return cities.length * MISS;
}
const lowCities = cities.map((city) => city.toLowerCase());
let cache = [];
const totalTime = lowCities.reduce((time, city) => {
if (isInCache(cache, city)) {
cache = [...removeFromCache(cache, city), city];
return time + HIT;
}
if (cache.length >= cacheSize) {
cache.shift();
}
cache.push(city);
return time + MISS;
}, 0);
return totalTime;
}