프로그래머스 level2 ) 캐시

하우르·2021년 5월 6일
0

문제 설명

캐시
지도개발팀에서 근무하는 제이지는 지도에서 도시 이름을 검색하면 해당 도시와 관련된 맛집 게시물들을 데이터베이스에서 읽어 보여주는 서비스를 개발하고 있다.
이 프로그램의 테스팅 업무를 담당하고 있는 어피치는 서비스를 오픈하기 전 각 로직에 대한 성능 측정을 수행하였는데, 제이지가 작성한 부분 중 데이터베이스에서 게시물을 가져오는 부분의 실행시간이 너무 오래 걸린다는 것을 알게 되었다.
어피치는 제이지에게 해당 로직을 개선하라고 닦달하기 시작하였고, 제이지는 DB 캐시를 적용하여 성능 개선을 시도하고 있지만 캐시 크기를 얼마로 해야 효율적인지 몰라 난감한 상황이다.

어피치에게 시달리는 제이지를 도와, DB 캐시를 적용할 때 캐시 크기에 따른 실행시간 측정 프로그램을 작성하시오.

조건

캐시 교체 알고리즘은 LRU(Least Recently Used)를 사용한다.
cache hit일 경우 실행시간은 1이다.
cache miss일 경우 실행시간은 5이다.

캐시 교체 알고리즘은 LRU(Least Recently Used)

  • 가장 오랫동안 참조되지 않은 페이지를 교체하는 기법
  • 페이지내에 데이터가 존재하는 데이터라면 페이지 내에서 제거한다음 맨위로 다시 그 데이터를 옯긴다.
  • 새로운 데이터이고 length가 부족하다면 맨 아래 데이터를 삭제하고 맨 위에 저장
  • LRU를 구현 하려면 페이지들의 참조 순서를 기록하는 방법이 필요
  • 계수기(counter)를 이용하는 구현
    - 단점 실행시간 부담 페이지 참조할때마다 counter 값을 갱신해야함
    - 페이지 교체시에는 counter필드 값이 최소인것을 검색해야함
  • 스택(Stack)을 이용한 구현
    - 페이지 참조시 마다 스택의 페이지 번호를 top으로 올려야 하므로 스택 삭제/삽입 연산이 필요

구현1단계)

먼저 LRU를 구현하기로 했다.
java로 구현해야하기 때문에 Queue를 이용하기로 했다.
경우1. 캐시에 데이터가 있을 경우
경우2. 캐시에 데이터가 없고 아직 캐시가 차지 않았을때
경우3. 캐시가 0일경우 없을경우
경우4. 이모든 것의 예외 캐시에 데이터가 없고 캐시에 자리가 없을 경우

※주의해야하는 점

1. Queue의 contains 메소드는 대소문자를 구별하지 않는다.
2. 캐시 size가 0일 경우 캐시를 사용하지 않기 때문에 실행시간은 모두 5이다.

import java.io.IOException;
import java.util.LinkedList;
import java.util.Queue;
class Solution {
    public int solution(int cacheSize, String[] cities) {
        Queue<String> cacheQueue = new LinkedList<>();
		int runningTime = 0;
		int cacheHit = 1;
		int cacheMiss = 5;
		for(int i=0; i<cities.length;i++)
		{
			String city = cities[i].toLowerCase();
			if(cacheQueue.contains(city))
			{
				cacheQueue.add(city);
				cacheQueue.remove(city);
				runningTime+=cacheHit;
			}
			else if(!cacheQueue.contains(city) && cacheQueue.size()<cacheSize)
			{
				cacheQueue.add(city);
				runningTime+=cacheMiss;
			}
			else if(cacheQueue.size()==0)
			{
				runningTime+=cacheMiss;
			}
			else
			{
				cacheQueue.poll();
				cacheQueue.add(city);
				runningTime+=cacheMiss;
			}
		}
        return runningTime;
    }
}
profile
주니어 개발자

0개의 댓글