[프로그래머스 알고리즘] 1차 캐시 (level 2)

Future·2023년 9월 12일

문제

LRU

운영체제에서 배운 페이징 알고리즘이 나왔다.
LRU(Least Recently Used) 알고리즘은 가장 오랫동안 참조되지 않은 페이지를 교체하는 알고리즘이다. 캐시의 메모리는 한정되어 있고, 한번 참조된 데이터는 캐시에 적재 되는데, 캐시가 꽉 찬 상태에서 cache miss가 되면(캐시에 찾는 데이터가 없으면), 현재 캐시에 적재된 데이터 중, 어떤 데이터를 제거하고 새 데이터를 적재할 것인지 결정할 알고리즘이 필요하다. LRU는 그 알고리즘 중 하나이다.
++ 페이지 교체 알고리즘 -> https://velog.io/@kksshh0612/Virtual-Memory3

문제 풀이 (java)

LinkedList를 이용하였다.
1. 대소문자는 무시하기 때문에, 리스트에 문자가 있는지 확인할 때, .toLowerCase()를 사용하여 소문자로 통일시켜 주었다.
2. cache miss가 난 경우, 아직 캐시가 차지 않았으면 맨 뒤에 add / 캐시가 꽉 찼으면 리스트 맨 앞에서 빼고 (pollFirst()) 맨 뒤에 add
3. cache hit이 된 경우, 리스트에서 해당 데이터 빼고, 맨 뒤에 add
---> 여기까지 했는데, 제출 후 테스트에서 몇개 케이스에서 실패가 나왔다.
+조건. cache size가 0인 경우 처리를 해줘야 한다.

코드

import java.util.*;
//
class Solution {
    public int solution(int cacheSize, String[] cities) {
        int answer = 0;
        LinkedList list = new LinkedList<>();
//        
        if(cacheSize > 0){
            for(String city : cities){
//               
                if(!list.contains(city.toLowerCase())){       //miss
//                    
                    if(list.size() < cacheSize){        //아직 캐시가 차지 않았으면 add
                        list.add(city.toLowerCase());
                    }
                    else{
                        list.pollFirst();                    
                        list.add(city.toLowerCase());
                    }
                    answer += 5;
                }
                else{                       //hit
                    answer++;
                    list.remove(city.toLowerCase());
                    list.add(city.toLowerCase());
                }
            }
        }
        else{
            answer = 5 * cities.length;
        }
//       
        return answer;
    }
}
profile
Record What I Learned

0개의 댓글