관리 메뉴

Tree's 개발일기

[자바] [1차] 캐시 본문

문제풀이/프로그래머스

[자바] [1차] 캐시

tree0123 2023. 8. 12. 10:24
728x90

https://school.programmers.co.kr/learn/courses/30/lessons/17680

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

캐시 교체알고리즘 중 LRU 알고리즘 (가장 오랫동안 참조되지 않은 페이지를 교체하는 기법)을 사용하고, cache miss와 cache hit에 따라 점수를 계산해야 한다.

 

여기서 핵심은 LRU알고리즘을 알아야한다. 

1. 현재 데이터가 캐시에 있다 -> 캐시에 있는 데이터는 지우고, 새로운 캐시를 넣어야한다 (참조한 페이지는 remove하고 새로 페이지를 add한다)

* 이때, poll()을 사용하면 안된다. 왜냐면, 이 페이지를 참조했는지를 알기 위해선 quque에 앞쪽에는 오랫동안 참조되지 않은 것 ~ 뒤쪽은 최근 데이터 순으로 들어가야한다. 그래서, 참조를 했다면 참조함을 표시하기 위해 해당 데이터를 없애고, 새 최근 데이터로 뒤쪽에 add를 한다. 

즉, [A,B,C]가 있을 때, A데이터가 있다면 [A,B,C]가 아닌, [B,C,A]형태로 들어간다!

 

 

2. 현재 데이터가 캐시에 없다 -> 아직 캐시가 차지 않았다면 추가만 하고, 캐시가 찼고, 여기에 없는 새로운 데이터라면 가장 오랫동안 참조되지 않은 페이지(맨 앞(queue의 poll))을 빼고, 새롭게 넣는다. 

import java.util.*;
class Solution {
    public int solution(int cacheSize, String[] cities) {
        int answer = 0;
        Queue<String> q = new LinkedList<>();
        if (cacheSize==0) {
            answer=cities.length*5;
            return answer;
        }
        
        for (int i=0; i<cities.length; i++) {
            cities[i] = cities[i].toUpperCase();
            if (q.contains(cities[i])) {
                q.poll();
                q.add(cities[i]); 
                answer++;
            }
            else {
                if (q.size()!=cacheSize) {
                    q.add(cities[i]);
                }
                else {
                    q.poll();
                    q.add(cities[i]);
                }
                answer+=5;
            }
        
        }
        return answer;
    }
}
728x90

'문제풀이 > 프로그래머스' 카테고리의 다른 글

[자바] 숫자짝꿍  (0) 2023.08.16
[자바] 피보나치 수  (0) 2023.08.14
[자바] 최솟값 만들기  (0) 2023.08.10
[자바]N개의 최소공배수  (0) 2023.07.29
[자바] 방금그곡  (0) 2023.07.29
Comments