Coding/알고리즘

[알고리즘 TIL] 캐시(Java, 자료구조)

kangplay 2025. 6. 2. 15:31
문제

https://school.programmers.co.kr/learn/courses/30/lessons/17680?language=java

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

프로그래머스 LV2. 자료구조

트러블 슈팅

페이지 교체 알고리즘 중 하나인 LRU를 이용해 푸는 문제이다. 하지만 LRU를 LFU와 헷갈려서 참조 횟수를 기반으로 구현하다가 오류가 났다. 이 기회에 페이지 교체 대표 알고리즘 3개에 대해 알아보았다.

  • FIFO(First In First Out): 메모리에 가장 오래 있던 페이지를 교체
  • LRU(Least Recently Used): 가장 오랫동안 사용되지 않았던 페이지를 교체
  • LFU(Least Frequently Used): 참조된 횟수가 가장 적은 페이지를 교체

LRU는 가장 오랫동안 사용되지 않은 페이지를 교체하는 알고리즘이므로, Queue 자료구조를 활용하여 FIFO 방식으로 교체하되, 페이지가 참조되면 Queue의 맨 뒤에 다시 적재하는 로직을 추가하였다.

 

간단해보이는 문제일지라도, 적절한 자료구조를 선택하여 풀어야한다.

구현
static class Solution {
        public int solution(int cacheSize, String[] cities) {
            int answer = 0;
            ArrayDeque<String> cache = new ArrayDeque<>();
            for (String city : cities) {
                city = city.toLowerCase();
                if(cache.contains(city)){
                    answer++;
                    cache.remove(city);
                    cache.add(city);
                } else {
                    answer+=5;
                    cache.add(city);
                    if(cacheSize<cache.size()) cache.poll();
                }
            }
            return answer;
        }
    }