[프로그래머스/Javascript] 캐시

알고리즘 - LRU 알고리즘 구현

Posted by Kyun2da on July 5, 2020

1️⃣서론

프로그래머스 level2 문제 [1차] 캐시입니다. Javascript를 이용하여 해결하였습니다.

2️⃣문제 설명

프렌즈블록1 프렌즈블록2

3️⃣풀이

이 문제는 LRU 알고리즘을 알고 있다면 좀더 쉽게 접근이 가능했던 문제가 아닌가 싶습니다.
캐시가 있다면 우리는 캐시 안에 내가 찾고자 하는 도시가 있다면 이것을 cache hit라고 하고, 없다면 이것을 cache miss라고 합니다. 이cache hitcache miss를 잘 구현하는 것이 이문제의 핵심이었던 것 같습니다. 풀이는 다음과 같습니다.

4️⃣ 내가 푼 소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
const solution = (cacheSize, cities) => {
  let answer = 0;
  let arr = [];

  //1. 도시를 모두 대문자로 통일한다.
  cities = cities.map((it) => it.toUpperCase());
  
  //2. 캐시사이즈가 0이면 모든게 cache miss 이므로 *5로 리턴한다.
  if (cacheSize == 0) return cities.length * 5;

  //3. 배열을 순회하며 cache hit이면 배열의 맨뒤로 푸시하고 
  // cache miss일때는 (배열이 꽉찼다면 맨앞을 제거하고) 배열의 맨뒤로 푸시한다.
  for (let i = 0; i < cities.length; i++) {
    const idx = arr.findIndex((it) => it === cities[i]);
    if (idx !== -1) {
      arr.splice(idx, 1);
      answer += 1;
    } else if (arr.length === cacheSize) {
      answer += 5;
      arr.shift();
    } else {
      answer += 5;
    }
    arr.push(cities[i]);
  }
  return answer;
};

5️⃣ 결론

LRU 알고리즘을 잘 기억하고 기회가 되면 캐시에 대해서 알아보면 좋을 것 같습니다.

6️⃣ 마치며..

질문과 지적은 환영합니다. 이 문제는 최적의 정답일 수도 아닐수도 있습니다.
궁금한게 있으시면 아래 댓글 남겨주세요.🙏
댓글은 저에게 큰 힘이 됩니다!
감사합니다. ❤️