CodingTest/programmers

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

ukunV 2021. 11. 15. 14:45

Link

 

코딩테스트 연습 - [1차] 캐시

3 ["Jeju", "Pangyo", "Seoul", "NewYork", "LA", "Jeju", "Pangyo", "Seoul", "NewYork", "LA"] 50 3 ["Jeju", "Pangyo", "Seoul", "Jeju", "Pangyo", "Seoul", "Jeju", "Pangyo", "Seoul"] 21 2 ["Jeju", "Pangyo", "Seoul", "NewYork", "LA", "SanFrancisco", "Seoul", "Ro

programmers.co.kr

 

Solution

[ Paging Algorithms ]

  1. FIFO: cache에 들어온지 가장 오래된 페이지 교체
  2. LRU: cache에서 가장 오랫동안 사용하지 않은 페이지 교체
  3. LFU: cache에서 사용 빈도가 가장 적은 페이지 교체
from collections import deque

def solution(cacheSize, cities):
    if cacheSize == 0:
        return len(cities) * 5

    answer = 0

    cache = deque()

    for i in range(len(cities)):
        t = cities[i].lower()

        if t in cache:
            answer += 1
            cache.remove(t)
        else:
            answer += 5
            if len(cache) == cacheSize:
                cache.popleft()

        cache.append(t)

    return answer
🔑 key point: Paging Algorithm

 

Other Solution

해당 풀이는 필자의 풀이와 유사하지만 deque에 maxlen을 사용하여 불필요한 과정을 제거하였다.

maxlen의 간단한 사용예시를 첨부하니 참고바란다.

from collections import deque

a = deque([1,2,3], maxlen=3)
print(a)
a.append(4)
print(a)

<output>
deque([1, 2, 3], maxlen=3)
deque([2, 3, 4], maxlen=3)
from collections import deque

def solution(cacheSize, cities):
    if cacheSize == 0:
        return len(cities) * 5

    answer = 0

    cache = deque(maxlen=cacheSize)

    for i in cities:
        s = i.lower()

        if s in cache:
            cache.remove(s)
            answer += 1
        else:
            answer += 5

        cache.append(s)

    return answer
🔑 key point: Paging Algorithm
📌 Tip: deque(maxlen=cacheSize)