프로그래머스 캐시 Java - 2018 카카오 블라인드 채용
문제
문자열로 구성된 도시 리스트를 캐시 사이즈와 LRU캐시를 기반으로 적용했을 때 총 실행시간을 구하라
도시는 소문자/대문자가 섞여있고 공백/특수문자는 없다. LRU 캐시는 가장 최근에 교체되지 않는 값을 바꾸는 기법중 하나로 가장 오랜 기간 사용하지 않은 것을 제거하면 된다.
접근
- 주어진 문자열의 값을 캐시할 자료구조를 선언
- 캐시를 위한 자료구조에 값이 존재하면 hit 실패하면 miss 에 따라 실행시간 더하기
- hit 일 경우 캐시 기법에 따라 참조 값 이동
- miss 일 경우 캐시 사이즈가 부족한 경우 가장 오래된 값 제거하고 새로운 값을 저장
풀이
1번
int answer = 0;
ArrayList<String> list = new ArrayList<>();
for(String city : cities) {
String temp = city.toLowerCase();
if(list.contains(temp)) { //hit
answer += 1;
int idx = list.indexOf(temp);
list.remove(idx);
list.add(temp);
} else { //miss
answer += 5;
if(cacheSize > 0) {
if(list.size() >= cacheSize)
list.remove(0);
list.add(temp);
}
}
}
return answer;
- ArrayList를 활용하여 캐시 기능 구현(0번째가 가장 참조한지 오래된 것, 1, 2, ,3 커질수록 최신참조)
- 도시를 소문자로 모두 변경한 후 list 에 포함되어있는지 확인. 이런식으로 증가한다.
- 만약 hit인 경우, 해당 인덱스의 값을 지우고 list 의 마지막에 넣기(LRU)
- 만약 miss인 경우, 캐시 사이즈보다 큰 경우 가장 오래된 0번째의 값을 지우고 새로운 값을 저장
LRU 캐시 기법에 대한 이해만 있다면 크게 어렵지 않다. 또한, 문자열을 모두 소문자로 바꿔주는 센스가 필요하다.
결론
- 캐시 기법에는 FIFO(선착순), LFU(빈도), LRU(가장 최신것) 등이 있다