728x90
코드 힌트
문제 이해:
- 이 문제는 LRU (Least Recently Used) 캐시 알고리즘을 구현하는 것입니다. LRU 캐시는 가장 오랫동안 사용되지 않은 페이지(도시)를 교체하는 방식입니다.
- 주어진 cities 배열을 순차적으로 처리하면서, 각 도시에 대한 참조 여부에 따라 실행 시간을 계산해야 합니다.
LRU 캐시 설명:
- LRU 캐시는 한정된 크기의 메모리를 효율적으로 사용하기 위한 알고리즘입니다.
- 캐시에 있는 항목 중 가장 오랫동안 사용되지 않은 항목을 교체합니다.
- 캐시에 도시가 있으면 hit으로 간주하고 실행 시간에 1초를 더합니다.
- 캐시에 도시가 없으면 miss로 간주하고 실행 시간에 5초를 더합니다.
캐시 구현:
- 저는 캐시를 List로 구현했습니다. 리스트의 인덱스가 낮을수록 오랫동안 참조되지 않은 도시입니다.
- HashMap이든 우선순위를 저장할 수 있는 방법이 있다면 어떤 자료구조라도 상관없습니다.
- 캐시에 도시가 있으면 해당 항목을 제거한 후 리스트의 끝에 추가하여 최근에 참조된 것으로 업데이트합니다.
- 캐시에 도시가 없으면 새로운 도시를 리스트의 끝에 추가합니다. 만약 캐시가 가득 차면 가장 앞에 있는 도시를 제거합니다.
알고리즘:
- cacheSize만큼의 공간을 가지는 캐시를 구현하기 위해 List를 사용합니다.
- cities 배열을 순차적으로 순회하며 도시 이름을 소문자로 변환한 후, 캐시에 해당 도시가 있는지 확인합니다.
- 도시가 캐시에 있다면, 그 도시를 캐시에서 제거한 후, 리스트의 끝에 추가하여 참조를 갱신합니다. 실행 시간에 1초를 더합니다.
- 도시가 캐시에 없다면, 리스트의 끝에 도시를 추가하고, 실행 시간에 5초를 더합니다.
- 만약 캐시가 가득 찼다면, 리스트의 첫 번째 요소를 제거하여 가장 오랫동안 참조되지 않은 도시를 제거합니다.
- 모든 처리가 끝난 후 총 실행 시간을 반환합니다.
정답은 더보기 클릭
더보기
import java.util.*;
class Solution {
public int solution(int cacheSize, String[] cities) {
// 실행 시간
int result = 0;
// 캐시 (index가 0에 가까울 수록 오랫동안 참조하지 않음)
List<String> cache = new ArrayList<>();
// cities배열을 순차적으로 실행
for (String city : cities) {
// 도시 이름을 소문자로 변환
city = city.toLowerCase();
int idx = cache.indexOf(city);
// 캐시에 저장된 도시일 때 (Hit)
if (idx >= 0) {
cache.remove(idx); // 캐시에서 요소 삭제 후 추가
cache.add(city);
result += 1; // 실행 시간 1초 추가
}
// 캐시에 없는 도시일 때 (Miss)
else {
cache.add(city);
result += 5; // 실행 시간 5초 추가
}
// 캐시가 저장할 수 있는 크기를 초과했을 때
if (cache.size() > cacheSize) {
cache.remove(0); // 가장 오랫동안 참조하지 않은 도시 삭제
}
}
// 총 실행 시간 반환
return result;
}
}
728x90
'프로그래머스(Java) > Level 2' 카테고리의 다른 글
[프로그래머스] 피로도 (0) | 2024.08.14 |
---|---|
[프로그래머스] 튜플 (0) | 2024.08.14 |
[프로그래머스] 행렬의 곱셈 (0) | 2024.08.12 |
[프로그래머스] n^2 배열 자르기 (0) | 2024.08.12 |
[프로그래머스] 게임 맵 최단거리 (0) | 2024.08.01 |