
cities, 캐시 크기 cacheSizeLRU (Least Recently Used) 알고리즘을 사용하여 캐시 정책에 따라 도시 이름을 넣고 뺄 때 처리 비용을 정확히 계산해야 함
LRU 알고리즘은 가장 오래 전에 사용된 항목을 우선 제거하는 캐시 교체 정책입니다.
miss → 삽입hit → 기존 항목을 제거하고 다시 넣어서 가장 최신으로 이동arrfunction solution(cacheSize, cities) {
const citiestoLower = cities.map(e => e.toLowerCase());
const arr = [];
let answer = 0;
for (let i = 0; i < cities.length; i++) {
answer = arr.includes(citiestoLower[i]) ? answer + 1 : answer + 5;
arr.push(citiestoLower[i]);
if (arr.length > cacheSize) arr.shift();
}
return answer;
}
includes()로 hit 판별 후 중복 제거 없이 pushshift()로 엉뚱한 항목이 제거됨 → LRU 정책 위반Setfunction solution(cacheSize, cities) {
if (cacheSize === 0) return cities.length * 5;
const cache = new Set();
let answer = 0;
for (const city of cities) {
const key = city.toLowerCase();
if (cache.has(key)) {
cache.delete(key); // 갱신
cache.add(key);
answer += 1;
} else {
if (cache.size >= cacheSize) {
const oldest = cache.values().next().value; // 첫 값을 감지하는 정석적인 방법
cache.delete(oldest);
}
cache.add(key);
answer += 5;
}
}
return answer;
}
삽입 순서가 유지되면서 arr의 includes보다 빠르고, 값만 관리하기 때문에 가장 적합함
Mapfunction solution(cacheSize, cities) {
if (cacheSize === 0) return cities.length * 5;
const cache = new Map();
let cost = 0;
for (const city of cities) {
const key = city.toLowerCase();
if (cache.has(key)) {
cache.delete(key);
cache.set(key, true);
cost += 1;
} else {
if (cache.size >= cacheSize) {
const oldest = cache.keys().next().value; // key로 탐색
cache.delete(oldest);
}
cache.set(key, true);
cost += 5;
}
}
return cost;
}
key → value 구조로 동작함 (ex. URL → 데이터)Map은 삽입 순서를 유지하면서도 키 기반 접근과 삭제가 효율적임Map이 더 일반적임| 항목 | Set 방식 | Map 방식 |
|---|---|---|
| 코드 길이 | 짧고 간단 | 약간 더 길음 |
| 효율성 | 매우 좋음 | 거의 동일 (LRU 동작에 적합) |
| 현실성 | 단일 값일 경우 적합 | 실무에서 더 자주 쓰임 (key-value 구조) |
| 확장성 | 제한적 | 확장 유리 (value, timestamp 등 저장 가능) |
학습 목적엔
Set이 간단하고 효율적이지만,
실제 캐시처럼 동작하는 구조를 이해하려면Map을 활용한 구현을 익히는 것이 더 현실적이다.