https://school.programmers.co.kr/learn/courses/30/lessons/17680
지도개발팀에서 근무하는 제이지는 지도에서 도시 이름을 검색하면 해당 도시와 관련된 맛집 게시물들을 데이터베이스에서 읽어 보여주는 서비스를 개발하고 있다.
이 프로그램의 테스팅 업무를 담당하고 있는 어피치는 서비스를 오픈하기 전 각 로직에 대한 성능 측정을 수행하였는데, 제이지가 작성한 부분 중 데이터베이스에서 게시물을 가져오는 부분의 실행시간이 너무 오래 걸린다는 것을 알게 되었다.
어피치는 제이지에게 해당 로직을 개선하라고 닦달하기 시작하였고, 제이지는 DB 캐시를 적용하여 성능 개선을 시도하고 있지만 캐시 크기를 얼마로 해야 효율적인지 몰라 난감한 상황이다.
어피치에게 시달리는 제이지를 도와, DB 캐시를 적용할 때 캐시 크기에 따른 실행시간 측정 프로그램을 작성하시오.
- 문제에서 LRU 알고리즘을 사용해 문제를 해결하라는 조건을 제시했다.
- 학교에서 OS 수업 때 배운 적이 있다. LRU 알고리즘은 가장 오랫동안 참조되지 않은 페이지를 교체하는 기법이다. FIFO 알고리즘과 헷갈릴 수 있지만 개념이 다르다.
- 데이터 요청 시 캐시 메모리가 해당 데이터를 가지고 있다면 cache hit
- 데이터 요청 시 캐시 메모리가 해당 데이터를 가지고 있지 않다면 cache miss
- 문제에서 주어진 cacheSize만큼의 길이를 갖는 리스트 cache를 생성해 주었다.
- 반복문을 통해 리스트 내 모든 원소를 0으로 초기화 시켜주었다.
- cache hit와 cache miss라는 변수에 해당하는 값을 초기화시켜주었다.
- cacheSize == 0 이라면 cache hit가 발생할 수 없기 때문에 조건문을 사용해 cacheSize가 0 일때 출력값을 리턴시켜주었다.
- cacheSize == 0 이라면 출력값은 len(cities)*5가 된다.
- 대소문자 구분을 하지 않기에 cities의 모든 원소를 소문자화 해주었다.
- 반복문과 조건문을 사용해 cache에 cities의 원소를 삽입, 삭제를 하며 발생한 상황에 따라 answer 값에 cache hit와 cache miss 값을 추가해주었다.
- cache가 비어있다면 데이터를 append()
- 현재 데이터가 cache 안에 없다면 cache[0]을 삭제, 현재 데이터를 추가 (cache[0]은 가장 오랫동안 참조되지 않은 데이터를 의미)
- 현재 데이터가 cache 안에 있다면 cache 내 해당 데이터를 삭제, 다시 추가
- answer 값을 리턴해주었다.
def solution(cacheSize, cities): answer = 0 cache = [0 for i in range(cacheSize)] cache_hit = 1 cache_miss = 5 # cacheSize가 0일 때 if cacheSize == 0: return len(cities) * 5 # 반복문 for i in cities: x = i.lower() if len(cache) == 0: cache.append(x) elif x not in cache: cache.pop(0) cache.append(x) answer += cache_miss else: cache.remove(x) cache.append(x) answer += cache_hit return answer
캐시에 대한 개념과 LRU 알고리즘에 대한 이해가 잘 되어 있다면 해결하기 쉬운 문제였다.
cache hit를 구현하는 데 있어서 해당 데이터를 삭제하고 다시 추가해주는 방법을 사용했는데, 이 과정에서 다른 방법을 모색해보기도 하였다.
만약 LRU 알고리즘이 아니고 FIFO 알고리즘을 사용하는 문제였다면 이런 과정 없이 cities의 0번째 인덱스를 삭제하는 과정을 반복했을 것이다.
하지만 LRU 알고리즘에서는 cache hit가 이루어지면 해당 데이터는 참조된 것이기 때문에 삭제 순위가 밀려나게 되는 점을 이용해 위의 방법을 사용했다.
학창시절 OS 강의를 열심히 수강했는데, 시간이 지난 지금도 페이지 교체 알고리즘에 대한 기억이 남아있어서 정말 다행이라 생각한다.
프로그래머스 기준 11점을 받아 매우 뿌듯한 문제였다!