알고리즘/프로그래머스
[프로그래머스][자바스크립트][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
}
- MISS와 HIT 했을 경우 더해지는 실행시간을 선언한다.
- cacheSize가 0일 경우를 예외처리해준다. 모든 경우가 MISS이므로 cities 길이만큼 MISS 처리해준다.
- 대소문자를 구분하지 않는다는 조건이 있으므로 모두 소문자로 변경해준다.
- cache에 indexOf를 통해 city 가 존재하는 것이 확인되면 HIT 실행시간만큼 answer에 더해준다.
- LRU 캐시 교체 알고리즘이므로 가장 최근에 접근한 내용이 cache 가장 뒤에 들어가므로 기존 cache에 존재하던 city를 splice로 삭제해준다.
- cache에 city가 존재하지 않으면 MISS 실행시간만큼 answer에 더해준다.
- cache가 가득차있을 경우 가장 오래된 맨 앞의 내용을 shift로 삭제해준다.
- 가장 최근에 접근한 city를 cache에 맨 뒤에 추가해준다.
- answer 를 반환하면 끝난다.