[프로그래머스/Lv2] [1차] 캐시
문제
제이지가 지도에서 도시 이름을 검색하면 해당 도시와 관련된 맛집 게시물을 데이터베이스에서 읽어 보여주는 서비스를 개발하고 있다.
그런데 이 로직의 실행시간이 길어 개선해야할 필요가 생겼다.
DB 캐시를 적용하여 성능 개선을 시도하였으나 캐시 크기를 얼마로 해야 효율적인지 몰라 곤란한 상황이다.
제이시를 도와 DB 캐시를 적용할 때 캐시 크기에 따른 실행시간 측정 프로그램을 만들어야 한다.
측정 프로그램은 캐시 크기(cachesize)와 도시이름 배열(cities)을 입력받아 실행시간을 반환한다.
제한사항
1. cachesize는 정수이며, 범위는 0 <= cachesize <= 30
2. cities는 도시이름으로 이루어진 배열로, 최대 도시 수는 100,000개이다.
3. 각 도시 이름은 공백, 숫자, 특수문자 등이 없는 영문자로 구성되며, 대소문자 구분을 하지 않는다.
4. 도시 이름은 최대 20자로 이루어져 있다.
조건
1. 캐시 교체 알고리즘은 LRU를 사용한다.
2. cache hit일 경우 실행시간은 1이다.
3. cache miss일 경우 실행시간은 5이다.
코드
def solution(cachesize, cities):
if cachesize == 0:
return len(cities) * 5
else:
answer = 0
cache = [0 for _ in range(cachesize)]
for city in cities:
try:
cache.index(city.lower())
del cache[cache.index(city.lower())]
cache.insert(cachesize-1, city.lower())
answer += 1
except:
del cache[0]
cache.insert(cachesize-1, city.lower())
answer += 5
return answer
설명
조건부터 확인하자.
LRU는 가장 오랫동안 참조되지 않은 페이지를 교체하는 알고리즘이다.
캐시에서 참조된 적이 없거나 참조된지 오래된 페이지를 삭제하면 된다.
cache hit은 참조하려는 페이지가 현재 캐시에 있는 상황일 때를 말한다.
cache miss는 참조하려는 페이지가 현재 캐시에 없는 상황일 때를 말한다.
코드를 보면서 자세하게 설명한다.
if cachesize == 0:
return len(cities) * 5
메인 로직에 들어가기 전에, 캐시사이즈가 0으로 주어지면 항상 cache miss가 일어나기 때문에
cities 배열의 길이만큼 5를 곱해서 반환해준다.
else:
answer = 0
cache = [0 for _ in range(cachesize)]
캐시사이즈가 0이 아니라면 answer를 0으로 초기화해두고
cache를 캐시사이즈만큼 0으로 초기화해준다.
for city in cities:
cities 배열에 있는 도시 이름(city)를 꺼내면서 반복한다.
try, except 문으로 cache hit, cache miss를 판단할 것이다.
index() 메소드를 사용, 에러가 발생하지 않는다면 cache hit,
에러가 발생한다면 cache miss로 판단한다.
try:
cache.index(city.lower())
del cache[cache.index(city.lower())]
cache.insert(cachesize-1, city.lower())
answer += 1
cache hit의 경우이다.
기존의 캐시에 있던 city를 제거하고
캐시의 가장 뒤에 city를 넣어준다.
기존에 있던 city를 제거하고 캐시의 가장 뒤에 city를 넣는 이유는 최근에 참조된 페이지라는 것을 표시하기 위함이다.
그 후에 answer에 1을 더한다.
except:
del cache[0]
cache.insert(cachesize-1, city.lower())
answer += 5
cache miss의 경우이다.
캐시의 가장 앞의 city를 제거하고(참조된지 가장 오래된 city)
캐시의 가장 뒤에 city를 넣어준다.
그 후에 answer에 5를 더한다.
return answer
반복문이 끝난 후에 answer를 반환한다.
'코딩테스트 > 연습문제' 카테고리의 다른 글
[프로그래머스/Lv2] 행렬의 곱셈 (0) | 2022.10.27 |
---|---|
[프로그래머스/Lv2] H-Index (0) | 2022.10.27 |
[프로그래머스/Lv2] 점프와 순간 이동 (0) | 2022.10.21 |
[프로그래머스/Lv2] 멀리 뛰기 (0) | 2022.10.21 |
[프로그래머스/Lv2] 예상 대진표 (0) | 2022.10.20 |