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

코린·2023년 6월 20일
0

알고리즘

목록 보기
17/44
post-thumbnail

문제

오늘도 문제가 길어서.. 링크로 남깁니다잇!!!!

문제 풀이

사실 오늘 문제에서 가장 큰 어려움은 LRU 알고리즘이 뭔지... 모른다는 것이었습니다..!!
뜨헉...!! 분명 학부때 배웠을게 분명한데....... 이렇게 시간이 지나면 까먹어 버리는거죠..
하지만 슬퍼하지 않고 다시 공부를 해쥽미다

LRU 알고리즘이란???????!!!

LRU 알고리즘은 가장 오랫동안 참조되지 않은 페이지를 교체하는 것 입니다.

Input : 123145

Output : 5413

시간123456
새로 들어오는 값123145
캐시 상태111223
22331
31 (hit!)14
45

위 처럼 작동하는 것입니다.

자자 이제 그럼 LRU가 뭔지 알았으니 이제 구현만 해주면 됩니다!

-> 도시 이름이 캐시에 있는 확인

없는 경우) 시간 +5

	캐시가 다 안 찬 경우) 맨 앞에 넣어주기

	캐시가 다 찬 경우) 맨 앞에 넣어주고 맨 마지막 값 없애주기

있는 경우) 시간 +1

	해당 도시이름이 있는 부분을 삭제하고 맨 앞에 값 넣어주기
    
    

잘못생각한점

맨 앞에 값을 추가할 때는 push가 아니라 unshift 로 넣어줘야 합니다.

캐시에 새로 넣어주려는 값이 존재할 경우에는 맨앞에 새로운 값을 넣고 맨 뒷 값을 없애주는 것이 아닙니다.

indexOf 함수는 해당 값의 위치를 알려주므로 있으면 1이 아니라 그 자리의 위치를 알려줍니다.

splice 함수 사용할때 두개의 인자를 받는데 처음 인자는 시작위치, 두번째 인자는 몇개를 자를 건지 입니다. 명심!!

결과 코드

function solution(cacheSize, cities) {
    var answer = 0;
    
    let cache = [];
    
    if(cacheSize === 0 ) return 5 * (cities.length); //캐시사이즈가 0인 경우도 있으므로
    
    for(let i=0;i<cities.length;i++){
        
        //대소문자 구분없이 비교하기 위해서
       let newCity = cities[i].toUpperCase();
           
        let index = cache.indexOf(newCity);
          
        if(index === -1){
                answer += 5; // miss 인 경우
               
               if(cache.length < cacheSize){
                   cache.unshift(newCity);
               }
               else{
                   cache.unshift(newCity);
                   cache.pop();
               }
              
           }
            else if(index !== -1){
                answer += 1; //hit 인 경우
                cache.splice(index,1);
                cache.unshift(newCity);
            }
           
         }
               
    return answer;     
}

이러면 완~~~료!!!!!

.
.
.
.
.
.
.

다들 문일병보고 힘내세요 물론 저도!

profile
안녕하세요 코린입니다!

0개의 댓글