Java
프로그래머스: [1차] 캐시
Daeryuk Kim
2024. 3. 7. 14:47
근데, 캐시가 뭘까요?
캐시(Cache)는 컴퓨터 시스템에서 사용되는 일종의 데이터 저장 공간입니다. 이 저장 공간은 데이터를 빠르게 검색하고 접근하는 데 사용됩니다.
- CPU 캐시: 이는 CPU와 메인 메모리 사이에 위치한 고속의 데이터 저장 공간입니다. CPU가 자주 접근하는 데이터나 명령어를 저장하고, CPU가 이를 빠르게 가져올 수 있게 합니다. 이로 인해 CPU는 메인 메모리에서 직접 데이터를 가져오는 것보다 훨씬 빠르게 작업을 수행할 수 있습니다.
- 웹 브라우저 캐시: 웹 브라우저는 사용자가 방문한 웹 페이지의 이미지, 스타일시트, 자바스크립트 파일 등을 로컬 저장소에 저장합니다. 이렇게 하면 사용자가 같은 웹 페이지를 다시 방문할 때 브라우저는 이전에 저장해둔 캐시 데이터를 불러와서 페이지 로딩 시간을 줄일 수 있습니다.
- 데이터베이스 캐시: 데이터베이스 시스템은 자주 사용되는 쿼리 결과를 캐시에 저장합니다. 이렇게 하면 같은 쿼리가 다시 요청되었을 때 데이터베이스는 실제로 디스크에서 데이터를 읽지 않고 캐시에 저장된 결과를 반환함으로써 응답 시간을 크게 줄일 수 있습니다.
이러한 캐시의 사용은 전체 시스템의 성능을 향상시키는 데 크게 기여하지만, 캐시의 크기가 제한적이기 때문에 어떤 데이터를 캐시에 유지할지, 어떤 데이터를 제거할지 결정하는 "캐시 교체 전략"이 중요합니다. 그리고 이것이 바로 문제에 언급된 LRU(Least Recently Used) 같은 알고리즘이 사용되는 곳입니다.
import java.util.*;
class Solution {
public int solution(int cacheSize, String[] cities) {
// 캐시의 크기가 0이면 모든 도시를 캐시에서 찾을 수 없으므로
// 캐시 미스가 항상 발생합니다.
// 따라서 총 실행 시간은 도시의 개수에 5를 곱한 값이 됩니다.
if(cacheSize == 0) return cities.length * 5;
LinkedList<String> cache = new LinkedList<>();
int answer = 0;
// 각 도시를 순회하면서 해당 도시가 캐시에 있는지 확인함.
for (String city : cities) {
// 대소문자를 구분하지 않기 때문에
// 모든 도시 이름을 소문자로 변환
city = city.toLowerCase();
/*
cache.remove(city)는 캐시에서 해당 도시를 제거하고,
그 도시가 캐시에 있었는지 여부를 반환합니다.
따라서 이 코드는 캐시 미스가 발생했는지를 확인하는 조건문임.
캐시 미스가 발생하면 캐시에 도시를 추가하고
실행 시간을 5 증가시킵니다.
만약 캐시가 가득 차 있다면
가장 오래된 도시를 제거합니다.
*/
if (!cache.remove(city)) { // cache miss
if (cache.size() == cacheSize) {
cache.poll();
}
answer += 5;
} else { // cache hit
answer += 1;
}
/*
캐시 미스가 발생하든, 캐시 히트가 발생하든
해당 도시를 캐시에 추가합니다.
캐시 히트가 발생했다면
이전에 캐시에서 해당 도시를 제거했기 때문에
다시 추가해야 합니다.
*/
cache.add(city);
}
return answer;
}
public static void main(String[] args) {
int cacheSize = 3;
String[] cities = {"Jeju", "Pangyo", "Seoul", "NewYork", "LA", "Jeju", "Pangyo", "Seoul", "NewYork", "LA"};
Solution sol = new Solution();
int result = sol.solution(cacheSize, cities);
System.out.println(result);
}
}