Study/Coding Test

[JS] ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ - μΊμ‹œ(LRU μ•Œκ³ λ¦¬μ¦˜)

Jieunny 2023. 2. 24. 10:16

πŸ“Œ  문제

μΊμ‹œ

μ§€λ„κ°œλ°œνŒ€μ—μ„œ κ·Όλ¬΄ν•˜λŠ” μ œμ΄μ§€λŠ” μ§€λ„μ—μ„œ λ„μ‹œ 이름을 κ²€μƒ‰ν•˜λ©΄ ν•΄λ‹Ή λ„μ‹œμ™€ κ΄€λ ¨λœ λ§›μ§‘ κ²Œμ‹œλ¬Όλ“€μ„ λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ 읽어 λ³΄μ—¬μ£ΌλŠ” μ„œλΉ„μŠ€λ₯Ό κ°œλ°œν•˜κ³  μžˆλ‹€.
이 ν”„λ‘œκ·Έλž¨μ˜ ν…ŒμŠ€νŒ… 업무λ₯Ό λ‹΄λ‹Ήν•˜κ³  μžˆλŠ” μ–΄ν”ΌμΉ˜λŠ” μ„œλΉ„μŠ€λ₯Ό μ˜€ν”ˆν•˜κΈ° μ „ 각 λ‘œμ§μ— λŒ€ν•œ μ„±λŠ₯ 츑정을 μˆ˜ν–‰ν•˜μ˜€λŠ”λ°, μ œμ΄μ§€κ°€ μž‘μ„±ν•œ λΆ€λΆ„ 쀑 λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ κ²Œμ‹œλ¬Όμ„ κ°€μ Έμ˜€λŠ” λΆ€λΆ„μ˜ μ‹€ν–‰μ‹œκ°„μ΄ λ„ˆλ¬΄ 였래 κ±Έλ¦°λ‹€λŠ” 것을 μ•Œκ²Œ λ˜μ—ˆλ‹€.
μ–΄ν”ΌμΉ˜λŠ” μ œμ΄μ§€μ—κ²Œ ν•΄λ‹Ή λ‘œμ§μ„ κ°œμ„ ν•˜λΌκ³  λ‹¦λ‹¬ν•˜κΈ° μ‹œμž‘ν•˜μ˜€κ³ , μ œμ΄μ§€λŠ” 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;
}

와 λΏŒλ“―ν•΄