프로그래머스_[1차] 캐시

임정민·2023년 10월 16일
1

알고리즘 문제풀이

목록 보기
117/173
post-thumbnail

프로그래머스 Lv2 문제입니다. 실전에 대비하기 위해 60분 시간제한을 두고 풀었습니다.

문제

https://school.programmers.co.kr/learn/courses/30/lessons/17680

[나의 풀이]

⌛ 31분 소요


def solution(cacheSize, cities):
    from collections import deque

    answer = 0
    
    cache = deque([])

    if cacheSize==0:
        answer = len(cities)*5

        return answer

    for city in cities:
        city = city.upper()
        if not city in cache:
            if len(cache)<cacheSize:
                cache.appendleft(city)
            else:
                cache.pop()
                cache.appendleft(city)
            answer += 5
        else:
            cache.remove(city)
            cache.appendleft(city)
            answer += 1

    return answer   

페이지 Cache가 작동하는 'LRU' 알고리즘을 구현하는 문제입니다. 처음 보는 알고리즘 이였지만 작동방식은 간단하여 알고리즘 정의를 참고하여 어렵지 않게 해결할 수 있었습니다.

구현하는데 있어 첫번째 포인트는 입력되는 도시명들이 대소문자를 구분하지 않으므로 대문자로 통일하는 것이였고 두번째로 Cache안에 있는 도시명 일 경우 deque.remove로 해당 도시명을 지우고 appendleft 방금 입력된 도시명으로 만드는 것이었습니다.🦩🦩🦩

[다른 사람의 풀이1]


def solution(cacheSize, cities):
    import collections
    cache = collections.deque(maxlen=cacheSize)
    time = 0
    for i in cities:
        print(cache)
        s = i.lower()
        if s in cache:
            cache.remove(s)
            cache.append(s)
            time += 1
        else:
            cache.append(s)
            time += 5
    return time

'나의 풀이'와 유사한 방식이되, deque의 최대크기를 CacheSize로 정의하여 Cache가 꽉찼을 때의 경우를 고려하지 않아도 되는 간결한 풀이었습니다.🐳🐳🐳

[다른 사람의 풀이2]


def solution(cacheSize, cities):
    # Least recently used 캐시를 모방하는 자료구조를 구현한 뒤,
    # 시뮬레이션 하는 문제.
    # 자료구조에 대해서는
    # Cache hit, cache miss 두 가지 상황만 생각하면 된다.
    # cache hit이면, 해당 데이터가 최근에 hit 되었음을 업데이트 해주고,
    # cache miss이면, 가장 오래된 데이터를 제거 후 새로운 데이터를 캐시에 추가
    # 
    # 캐시 크기는 일정하므로, O(n) search를 허용해도 될 듯. 리스트로 쉽게 가자.
    # 
    cache, answer = [], 0
    for city in [c.lower() for c in cities]:
        # cache hit인 상황.
        if city in cache and cacheSize > 0: # cacheSize가 0일수도 있음에 주의!
            answer += 1
            # 비효율적이긴 한데, 이러면 쉽게 구현할 수 있다.
            cache.remove(city)
            cache.append(city)
        # 이하는 cache miss인 상황.
        elif len(cache) < cacheSize:
            answer += 5
            cache.append(city)
        else:
            answer += 5
            cache = cache[1:]
            cache.append(city)
            
    return answer

Cache가 꽉찼을때 pop()하지 않고 슬라이싱으로 가장 오래된 도시명을 제외한 Cache 리스트로 초기화하고 새 도시명 append하는 방식이 인상깊었습니다.🐕🐕🐕

감사합니다.

profile
https://github.com/min731

0개의 댓글