[Python] 프로그래머스 lv2 - [1차] 캐시

2022. 12. 23. 11:09알고리즘/문제풀이

[Python] 프로그래머스 lv2 - [1차] 캐시

 

코딩테스트 연습 - [1차] 캐시 | 프로그래머스 스쿨 (programmers.co.kr)

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

문제 설명

 

문제에서 주어진 것

  • cacheSize : 도시이름을 저장할 수 있는 공간의 용량
  • cities : 도시의 이름이 담긴 배열, 대소문자 구분 x
  • 시간 : cache에 해당 도시가 있을 경우 +1 /  존재하지 않을 경우 +5
  • LRU : Least Recently Used - 캐시 알고리즘
    • 캐시에 공간이 부족할 때 가장 오랫동안 사용하지않은 항목을 제거하고 새로운 항목을 넣어줌 

 

풀이 방법

 

  1. cachesize 확인
    1. 만약 size가 0이라면 저장이 되는 캐시가 없으므로 return len(cities)*5
  2. size 확인 후 0 이상이면, cache가 들어갈 리스트 생성
  3. cities for 반복문으로 각 도시 체크
    1. 이때 문제에서 도시의 대소문자 구분을 하지않는다고 함
      1. 도시의 이름을 전부다 소문자로 변경해주면서 진행
    2. 만약 도시의 이름이 캐시리스트에  존재
      1. 시간(answer) +=1
      2. 해당 캐시 내부에서 재사용 되었으므로 기존의 리스트에서 pop(), append()를 통해 리스트를 최신화
        1. 오래된 도시의 이름을 제거하기 위해 사용
    3. 만약 도시의 이름이 캐시리스트에 존재X
      1. 시간 += 5
      2. 만약 캐시 리스트의 크기가 cache의 사이즈와 동일한 경우
        1. pop(0)를 통해 가장 오래된 캐시 제거
      3. 캐시에 새로 등장한 도시를 append()

 

코드

 

def solution(ca, ci):
    answer = 0
    if ca == 0 : # 1
        return len(ci)*5 #1-1
    else :
        cache = [] # 2
        for i in range(len(ci)): # 3
            ci[i] = ci[i].lower() # 3-1
            if ci[i] in cache: # 3-2
                answer +=1 # 3-2-1
                a = cache[cache.index(ci[i])]
                cache.pop(cache.index(a)) #3-2-2-2
                cache.append(a) 

            else : #3-3
                answer += 5 #3-3-1
                if len(cache) == ca: #3-3-2
                    cache.pop(0)
                cache.append(ci[i]) #3-3-3
        
    
    return answer