[JS] νλ‘κ·Έλλ¨Έμ€ - μΊμ(LRU μκ³ λ¦¬μ¦)
π λ¬Έμ
μΊμ
μ§λκ°λ°νμμ 근무νλ μ μ΄μ§λ μ§λμμ λμ μ΄λ¦μ κ²μνλ©΄ ν΄λΉ λμμ κ΄λ ¨λ λ§μ§ κ²μλ¬Όλ€μ λ°μ΄ν°λ² μ΄μ€μμ μ½μ΄ 보μ¬μ£Όλ μλΉμ€λ₯Ό κ°λ°νκ³ μλ€.
μ΄ νλ‘κ·Έλ¨μ ν
μ€ν
μ
무λ₯Ό λ΄λΉνκ³ μλ μ΄νΌμΉλ μλΉμ€λ₯Ό μ€ννκΈ° μ κ° λ‘μ§μ λν μ±λ₯ μΈ‘μ μ μννμλλ°, μ μ΄μ§κ° μμ±ν λΆλΆ μ€ λ°μ΄ν°λ² μ΄μ€μμ κ²μλ¬Όμ κ°μ Έμ€λ λΆλΆμ μ€νμκ°μ΄ λ무 μ€λ κ±Έλ¦°λ€λ κ²μ μκ² λμλ€.
μ΄νΌμΉλ μ μ΄μ§μκ² ν΄λΉ λ‘μ§μ κ°μ νλΌκ³ λ¦λ¬νκΈ° μμνμκ³ , μ μ΄μ§λ DB μΊμλ₯Ό μ μ©νμ¬ μ±λ₯ κ°μ μ μλνκ³ μμ§λ§ μΊμ ν¬κΈ°λ₯Ό μΌλ§λ‘ ν΄μΌ ν¨μ¨μ μΈμ§ λͺ°λΌ λκ°ν μν©μ΄λ€.
μ΄νΌμΉμκ² μλ¬λ¦¬λ μ μ΄μ§λ₯Ό λμ, DB μΊμλ₯Ό μ μ©ν λ μΊμ ν¬κΈ°μ λ°λ₯Έ μ€νμκ° μΈ‘μ νλ‘κ·Έλ¨μ μμ±νμμ€.
μ λ ₯ νμ
- μΊμ ν¬κΈ°(cacheSize)μ λμμ΄λ¦ λ°°μ΄(cities)μ μ λ ₯λ°λλ€.
- cacheSizeλ μ μμ΄λ©°, λ²μλ 0 β¦ cacheSize β¦ 30 μ΄λ€.
- citiesλ λμ μ΄λ¦μΌλ‘ μ΄λ€μ§ λ¬Έμμ΄ λ°°μ΄λ‘, μ΅λ λμ μλ 100,000κ°μ΄λ€.
- κ° λμ μ΄λ¦μ 곡백, μ«μ, νΉμλ¬Έμ λ±μ΄ μλ μλ¬Έμλ‘ κ΅¬μ±λλ©°, λμλ¬Έμ ꡬλΆμ νμ§ μλλ€. λμ μ΄λ¦μ μ΅λ 20μλ‘ μ΄λ£¨μ΄μ Έ μλ€.
μΆλ ₯ νμ
- μ λ ₯λ λμμ΄λ¦ λ°°μ΄μ μμλλ‘ μ²λ¦¬ν λ, "μ΄ μ€νμκ°"μ μΆλ ₯νλ€.
쑰건
- μΊμ κ΅μ²΄ μκ³ λ¦¬μ¦μ LRU(Least Recently Used)λ₯Ό μ¬μ©νλ€.
- cache hitμΌ κ²½μ° μ€νμκ°μ 1μ΄λ€.
- cache missμΌ κ²½μ° μ€νμκ°μ 5μ΄λ€.
π‘ μμ΄λμ΄
LRU μκ³ λ¦¬μ¦μΌλ‘ νλΌκ³ λ¬Έμ μ λμμλ€.
κ·Όλ° λͺ°λΌμ μ°Ύμλ΄€λΉ..γ γ
β LRU μκ³ λ¦¬μ¦(Least Recently Used)μ΄λ?
βοΈ κ°μ₯ μ€λ μκ° μ¬μ©λμ§ μμ νμ΄μ§λ₯Ό κ΅μ²΄νλ νμ΄μ§ κ΅μ²΄ μκ³ λ¦¬μ¦
β° μ£Όλ‘ μΊμμμ λ©λͺ¨λ¦¬λ₯Ό λ€μ°κΈ° μν΄ μ¬μ©νλ€.
β° μΊμλ μμμ΄ νμ λμ΄ μμΌλ©° μ΄λ€ λ°μ΄ν°λ₯Ό λ¨κΈ°κ³ , μ΄λ€ λ°μ΄ν°λ₯Ό μ§μΈμ§μ λν μκ³ λ¦¬μ¦μ΄ νμνλ€.
β° μ€λ μ°Έμ‘°λμ§ μμ λ°μ΄ν°λ₯Ό λ΄λ³΄λ΄λ 'μκ° μ§μμ±'μ μ±μ§μ κ°μ§λ μκ³ λ¦¬μ¦μ΄λ€.
β° μΊμ μ¬μ΄μ¦κ° 5μ΄κ³ 1 2 3 4 5 μμλ‘ μ μ₯λμλ€λ©΄, 1μ΄ κ°μ₯ μ΅κ·Όμ μ°μΈ μμ μ΄κ³ 5λ κ°μ₯ μ€λ«λμ μ°μ΄μ§ μμ μμ μ΄λ€.
β° Cache miss μΈ κ²½μ°
- μΊμ λ°°μ΄μ 첫λ²μ§Έ μμμ κ° μΆκ°
- μΊμ λ°°μ΄μ λ§μ§λ§ μμ μμ (κ°μ₯ μ€λ μ¬μ©λμ§ μμ μμμ΄λ―λ‘)
β° Cache hitμΈ κ²½μ°
- μΊμ λ°°μ΄μμ hit μ§μ κΉμ§ μ΄λ
- hit κ°μ μΊμ λ°°μ΄ 0λ²μΌλ‘ μ΄λ(λ°©κΈ μ¬μ©λμκΈ° λλ¬Έμ)
μ μ€λͺ μ λ°νμΌλ‘ ꡬνν΄λ΄€λ€.
βοΈ νμ΄
function solution(cacheSize, cities) {
var answer = 0;
const cache = [];
for(let i=0; i<cities.length; i++){
cities[i] = cities[i].toLowerCase();
// λμλ¬Έμ κ΅¬λΆ μνλ―λ‘ μΌλ¨ λͺ¨λ μλ¬Έμλ‘ λ°κΏμ€λ€.
if(cache.length < cacheSize){ // μΊμ μ¬μ΄μ¦λ³΄λ€ μΊμ λ°°μ΄μ΄ μμ λ
if(!cache.includes(cities[i])) {
// μΊμλ―Έμ€λ©΄ 맨 μμ μμ μΆκ°νκ³ μκ° +5
cache.unshift(cities[i]);
answer += 5;
}
else {
// μΊμ ννΈλ©΄ κ·Έ μμΉλ‘ κ°μ κ·Έ μμλ₯Ό 맨 μμΌλ‘ λΉΌμ€κ³ μκ° +1
let idx = cache.indexOf(cities[i]);
cache.unshift(cities[i]);
cache.splice(idx+1, 1);
answer +=1;
}
}
else{ // μΊμ μ¬μ΄μ¦λ³΄λ€ μΊμ λ°°μ΄μ΄ ν΄ λ
if(!cache.includes(cities[i])) {
cache.unshift(cities[i]);
cache.pop();
answer += 5;
}
else {
let idx = cache.indexOf(cities[i]);
cache.unshift(cities[i]);
cache.splice(idx+1, 1);
answer +=1;
}
}
}
return answer;
}
μ λΏλ―ν΄