처음에는 테스트케이스를 절반만 통과하길래 보니까, cashe hit일 때의 city를 cache에서 빼서 queue에 다시 넣어줘야했다. 그렇게 하니까 또다시 테스트케이스 2개를 통과 못하길래 보니까, cacheSize가 0일때 또 따로 처리를 해줘야했다. 🤧
function solution(cacheSize, cities) {
let time = 0;
let cache = [];
// 소문자 변경
cities = cities.map(city => city.toLowerCase());
if(cacheSize === 0) return cities.length * 5;
for(let i = 0; i < cities.length; i++){
if(cache.includes(cities[i]) === true) {
cache.splice(cache.indexOf(cities[i]), 1);
cache.push(cities[i]);
time += 1;
}
if(cache.includes(cities[i]) === false){
if(cache.length >= cacheSize) cache.shift();
cache.push(cities[i]);
time += 5;
}
}
return time;
}
페이지 교체 알고리즘은 가상 메모리 시스템에서 메모리에 올라와 있지 않은 페이지를 대체할 페이지를 선택하는 알고리즘이다. 이 알고리즘은 메모리의 페이지 프레임 수가 한정되어 있는 상황에서 사용된다.
FIFO
: 가장 오래전에 메모리에 적재된 페이지를 대체한다.
LFU
: 가장 적게 참조된 페이지를 대체한다.
LRU
: 가장 최근에 참조되지 않은 페이지를 대체한다.
toLowerCase()
: 문자열을 소문자로 변환해 반환한다. 원래의 str에 영향을 주지 않는다.
str.toLowerCase()
toUpperCase()
: 문자열을 대문자로 변환해 반환한다. 원래의 str에 영향을 주지 않는다.
str.toUpperCase()
indexOf()
: 배열 내의 요소의 최초의 인덱스를 반환한다. 발견되지 않으면 -1
arr.indexOf(searchElement[, fromIndex])
searchElement : 배열에서 찾을 요소
fromIndex : 검색을 시작할 인덱스
pop()
: 배열에서 마지막 요소를 제거하고 그 요소를 반환합니다.
arr.pop()
push()
: 배열의 끝에 하나 이상의 요소를 추가하고, 배열의 새로운 길이를 반환한다.
arr.push(element1[, ...[, elementN]])
shift()
: 배열에서 첫 번째 요소를 제거하고, 제거된 요소를 반환한다.
arr.shift()
unshift()
: 새로운 요소를 배열의 맨 앞쪽에 추가하고, 배열의 새로운 길이를 반환한다.
arr.unshift([...elementN])
slice()
: 어떤 배열의 begin부터 end까지(end 미포함)에 대한 얕은 복사본을 새로운 배열 객체로 반환한다. 원본 배열은 바뀌지 않는다.
arr.slice([begin[, end]])
begin
추출 시작점에 대한 인덱스를 의미한다.
음수 인덱스는 배열의 끝에서부터의 길이를 나타낸다.
end
추출을 종료할 기준 인덱스입니다.
end가 생략되면 slice()는 배열의 끝까지 추출한다.
splice()
: 배열의 기존 요소를 삭제 또는 교체하거나 새 요소를 추가하여 배열의 내용을 변경한다. 제거한 요소를 담은 배열을 반환한다.
array.splice(start[, deleteCount[, item1[, item2[, ...]]]])
start
배열의 변경을 시작할 인덱스이다.
음수인 경우 배열의 끝에서부터 요소를 세어나간다.
deleteCount
배열에서 제거할 요소의 수입니다.
deleteCount를 생략하면 start부터의 모든 요소를 제거한다.
item1, item2, ...
배열에 추가할 요소이다.
아무 요소도 지정하지 않으면 splice()는 요소를 제거하기만 한다.