알고리즘/프로그래머스

[프로그래머스][자바스크립트][Level2][카카오] 캐시

Benjamin_Choi 2022. 2. 22. 20:53

풀이

 

/**
 * 캐시.js
 * https://programmers.co.kr/learn/courses/30/lessons/17680?language=javascript
 */

const MISS = 5, HIT = 1; // 1

function solution(cacheSize, cities) {
    if (cacheSize === 0) return MISS * cities.length; // 2
    
    let answer = 0;
    const cache = [];
    cities
        .map((city) => city.toLowerCase()) // 3
        .forEach((city) => { 
            const cityIdx = cache.indexOf(city);
            
            if (cityIdx > -1) {
                answer += HIT; // 4
                cache.splice(cityIdx, 1); // 5
            } else {
                answer += MISS; // 6
                if (cache.length === cacheSize) cache.shift(); // 7
            } 
            
            cache.push(city); // 8
        });

    return answer; // 9
}

 

  1. MISS와 HIT 했을 경우 더해지는 실행시간을 선언한다.
  2. cacheSize가 0일 경우를 예외처리해준다. 모든 경우가 MISS이므로 cities 길이만큼 MISS 처리해준다. 
  3. 대소문자를 구분하지 않는다는 조건이 있으므로 모두 소문자로 변경해준다. 
  4. cache에 indexOf를 통해 city 가 존재하는 것이 확인되면 HIT 실행시간만큼 answer에 더해준다.
  5. LRU 캐시 교체 알고리즘이므로 가장 최근에 접근한 내용이 cache 가장 뒤에 들어가므로 기존 cache에 존재하던 city를 splice로 삭제해준다.
  6. cache에 city가 존재하지 않으면 MISS 실행시간만큼 answer에 더해준다.
  7. cache가 가득차있을 경우 가장 오래된 맨 앞의 내용을 shift로 삭제해준다. 
  8. 가장 최근에 접근한 city를 cache에 맨 뒤에 추가해준다.
  9. answer 를 반환하면 끝난다.